★ ora_client_ip_address: 用于返回客户端的IP地址
★ ora_database_name:用于返回当前数据库名
★ ora_des_encrypted_password:用于返回DES加密后的用户口令
★ ora_dict_obj_name:用于返回DDL操作所对应的数据库对象名
★ ora_dict_obj_name_list(name_list OUT ora_name_list_t):用于返回在事件中被修改的对象名列表
★ ora_dict_obj_owner:用于返回DDL操作所对应的对象的所有者名
★ ora_dict_obj_owner_list(owner_list OUT ora_name_list_t):用于返回在事件中被修改对像的所有者列表
★ ora_dic_obj_type:用于返回DDL操作所对应的数据对象的类型
★ ora_grantee(user_list OUT ora_name_list_t):用于返回授权事件的授权者
★ ora_instance_num:用于返回例程号
★ ora_is_alter_column(column_name IN VARCHAR2):用于检没特定列是否被修改
★ ora_is_creating_nested_table:用于检测是否正在建立嵌套表
★ ora_is_drop_column(column_name IN VARCHAR2):用于检测特定列是否被删除
★ ora_is_servererror(error_number):用于检测是否返回了特定Oracle错误
★ ora_login_user:用于返回登录用户名
★ ora_sysevent:用于返回触发器的系统事件名

1,在SQL语句中,想得到和Linux下一样的命令行效果,前面加!
比如,在Linux下查看当前目录下的所有文件按照时间排序,可以使用
$ ls -ltr
在SQL命令行下,则可以使用如下语句:
SQL> !ls -ltr

2,查看Oracle进程
SQL>!ps -aef| grep ora

3,可以使用TOP命令
SQL>!top

4,使用ipcs命令
SQL>!ipcs -a

这次学习Oracle的批量绑定的概念。

批量绑定是从Oracle9i开始新增加的特性,通过批量绑定,可以极大的加快数据处理速度。提高应用程序的性能。

先建立DEMO表。

CREATE TABLE demo(
id NUMBER(6) PRIMARY KEY,
name VARCHAR2(10)
);

下面以不使用批量绑定和使用批量绑定为例来比较两种方法插入数据的速度。

1,不使用批量绑定

在9i之前,当使用VALUES子句插入数据的时候,每次只能插入一条数据,如果要插入5000条数据,就需要调用5000次INSERT语句。使用循环插入数据。

DECLARE
TYPE id_table_type IS TABLE OF NUMBER(6)
INDEX BY BINARY_INTEGER;
TYPE name_table_type IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
id_table id_table_type;
name_table name_table_type;
start_time NUMBER(10);
end_time NUMBER(10);
BEGIN
FOR i IN 1..5000 LOOP
id_table(i):=i;
name_table(i):='Name'to_char(i);
END LOOP;
start_time:=dbms_utility.get_time;
FOR i IN 1..id_table.COUNT LOOP
INSERT INTO demo VALUES(id_table(i),name_table(i));
END LOOP;
end_time:=dbms_utility.get_time;
dbms_output.put_line('总计时间(秒):'
to_char((end_time-start_time)/100));
END;
/
总计时间(秒):6.41

2,使用批量绑定

在Oracle9i开始,当使用VALUES子句为数据库表插入数据时,通过批量绑定特征,只需要执行一条INSERT一句就可以插入5000行数据。

DECLARE
TYPE id_table_type IS TABLE OF NUMBER(6)
INDEX BY BINARY_INTEGER;
TYPE name_table_type IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
id_table id_table_type;
name_table name_table_type;
start_time NUMBER(10);
end_time NUMBER(10);
BEGIN
FOR i IN 1..5000 LOOP
id_table(i):=i;
name_table(i):='Name'to_char(i);
END LOOP;
start_time:=dbms_utility.get_time;
FORALL i IN 1..id_table.COUNT
INSERT INTO demo VALUES(id_table(i),name_table(i));
end_time:=dbms_utility.get_time;
dbms_output.put_line('总计时间(秒):'
to_char((end_time-start_time)/100));
END;
/
总计时间(秒):.33

看看执行的速度结果,结论自然就出来了。

Rank函数是Oracle分析函数一种,今天来学习一个最简单的应用,作为入门。

stud_grade表,数据如下:

ID NAME GRADE
---------- ---------- ----------
1001 a1 78
1002 a2 80
1003 a3 90
1004 a4 80
1005 a5 70
1006 a6 80
1007 a7 87
1008 a8 85
1009 a9 85
1010 a10 85

查询后希望得到的结果排名如下:

no NAME GRADE
---------- ---------- ----------
1 a3 90
2 a7 87
3 a10 85
3 a8 85
3 a9 85
6 a6 80
6 a4 80

使用的rank函数如下:
select rank() over (order by grade desc ) id,name,grade from stud_grade;

用SCOTT用户创建了一个表,然后删除。却怎么也删不掉,提示的信息如下:

ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01422: exact fetch returns more than requested number of rows

怎么也不知道原因为什么,想问别人,估计没有经历过的也不知道。只好上网查,关键字就按照错误号搜索,结果查出来原因了——就是因为以前对DUAL表进行了一些操作造成的。

DUAL是一个很特殊的表,一般来说返回一行记录,为了测试这个,我当初往DUAL表里面又塞了两条数据,当时来看没有什么不妥,况且查询照样返回一条记录。

但是今天出现的TABLE无法删除的原因,就是跟这个有关,我把插入的两条记录在DUAL表下删除了,结果发现就可以DROP TABLE了。

看来以后对DUAL的操作要小心点,不然很容易出现问题。

SQL> create profile one_session limit sessions_per_user 1 ;
Profile created.

SQL> alter user scott profile one_session;
User altered.

SQL> alter system set resource_limit=true;
System altered.

SQL> connect scott/tiger
Connected.

SQL> host sqlplus scott/tiger

SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jul 5 15:02:21 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ERROR:
ORA-02391: exceeded simultaneous SESSIONS_PER_USER limit

Enter user-name:

订阅: 博文 (Atom)