drop table t; --建表 create table t ( x int ); --存储过程1 绑定变量 create or replace procedure proc1 as begin for i in 1 .. 10000 loop execute immediate 'insert into t values ( :x )' using i; end loop; end; / --存储过程2 不使用绑定变量 create or replace procedure proc2 as begin for i in 1 .. 10000 loop execute immediate 'insert into t values ( '||i||')'; end loop; end; / --执行 SQL> set timing on SQL> exec proc1 PL/SQL procedure successfully completed Executed in 0.359 seconds SQL> exec proc2 PL/SQL procedure successfully completed Executed in 4.312 seconds / --可以发现使用绑定变量和不适用绑定变量的时间差别 / ----------------------------------------------------------------------------------------------- 38. 定义一个绑定变量 VAR[IABLE] [variable [NUMBER|CHAR|CHAR (n)|NCHAR|NCHAR (n) |VARCHAR2 (n)|NVARCHAR2 (n)|CLOB|NCLOB|REFCURSOR]] 定义一个绑定变量,该变量可以在pl/sql中引用。 可以用print命令显示该绑定变量的信息。 如: column inst_num heading "Inst Num" new_value inst_num format 99999; column inst_name heading "Instance" new_value inst_name format a12; column db_name heading "DB Name" new_value db_name format a12; column dbid heading "DB Id" new_value dbid format 9999999999 just c; prompt prompt Current Instance prompt ~~~~~~~~~~~~~~~~ select d.dbid dbid , d.name db_name , i.instance_number inst_num , i.instance_name inst_name from v$database d, v$instance i; variable dbid number; variable inst_num number; begin :dbid := &dbid; :inst_num := &inst_num; end; / 说明: 在sql*plus中,该绑定变量可以作为一个存储过程的参数,也可以在匿名PL/SQL块中直接引用。为了显示用VARIABLE命令创建的绑定变量的值,可以用print命令 注意: 绑定变量不同于变量: 1. 定义方法不同 2. 引用方法不同 绑定变量::variable_name 变量:&variable_name or &&variable_name 3.在sql*plus中,可以定义同名的绑定变量与用户变量,但是引用的方法不同。 PL/SQL 过程已成功完成。 JASON@orcl>delete from t; 已删除0行。 JASON@orcl>commit; 提交完成。 JASON@orcl>print x variable scn number; exec :scn:=dbms_flashback.get_system_change_number print scn &与&&的区别 &用来创建一个临时变量,每当遇到这个临时变量时,都会提示你输入一个值。 &&用来创建一个持久变量,就像用用define命令或带new_vlaue字句的column命令创建的持久变量一样。当用&&命令引用这个变量时,不会每次遇到该变量就提示用户键入值,而只是在第一次遇到时提示一次。 如,将下面三行语句存为一个脚本文件,运行该脚本文件,会提示三次,让输入deptnoval的值: select count(*) from emp where deptno = &deptnoval; select count(*) from emp where deptno = &deptnoval; select count(*) from emp where deptno = &deptnoval; 将下面三行语句存为一个脚本文件,运行该脚本文件,则只会提示一次,让输入deptnoval的值: select count(*) from emp where deptno = &&deptnoval; select count(*) from emp where deptno = &&deptnoval; select count(*) from emp where deptno = &&deptnoval; 在输入sql语句的过程中临时先运行一个sql*plus命令# 在sql*plus中敲了很长的命令后, 突然发现想不起某个列的名字了 比如说, 你想查工资大于4000的员工的信息, 输入了下面的语句: SQL> select deptno, empno, ename 2 from emp 3 where 这时, 你发现你想不起来工资的列名是什么了. 这种情况下, 只要在下一行以#开头, 就可以执行一条sql*plus命令, 执行完后, 刚才的语句可以继续输入 SQL>> select deptno, empno, ename 2 from emp 3 where 6 #desc emp Name Null? Type ----------------------------------------- -------- -------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 6 sal > 4000; DEPTNO EMPNO ENAME
---------- ---------- ---------- 10 7839 KING |
|