num1 --------- 1 SQL> print num2; num2 --------- 2
(8).显示所有绑定变量的值
//print 命令输出所有绑定变量的值 SQL> print num1 --------- 1 num2 --------- 2 SQL>
(9).引用绑定变量
//使用:var_name引用绑定变量 SQL> select :num1 from dual; :NUM1 ---------- 1 num1 --------- 1 SQL>
(10).存储过程初始化绑定变量
//声明绑定变量m SQL> var m number; //创建一个带输出参数的存储过程test_pro SQL> create or replace procedure test_pro(num out number) as begin num:=10; end; / Procedure created //使用存储过程返回变量(引用绑定变量记得带上:) SQL> exec test_pro(num=>:m); PL/SQL procedure successfully completed m --------- 10 //输出绑定变量m的值 SQL> print m m --------- 10
(11).游标初始化绑定变量
绑定变量是REFCURSOR类型。一个参数使用refcursor,通过绑定变量类型定义为REFCURSOR,然后传入过程,打印绑定变量(效果和查询语句一样)。
//声明游标类型的绑定变量 //注意:在plsql dev的command window无法使用以下声明,需要再sqlplus中才有效 SQL> var curinfo refcursor //创建带输出参数,参数类型为sys_refcursor的存储过程 SQL> create or replace procedure cur_pro(cur_msg out sys_refcursor) as begin open cur_msg for select occ01,occ02 from occ_file where rownum<3; end; / Procedure created //exec执行存储过程 SQL> exec cur_pro(cur_msg=>:cur_info); PL/SQL 过程已成功完成。 //输出绑定变量cur_info的值 SQL> print cur_info OCC01 OCC02 --------------------------- 020040 松荣五金-SRWJ --------------------------- 020041 路得记-LDJ
由上面可以知道,print可以直接把refcursor的结果打印出来,不需要迭代查找。
(12).函数初始化绑定比那里
//创建函数 SQL> create or replace function test_fun(a in varchar2,b in varchar2) return varchar2 as c varchar2(255); begin c:=a||b; return c; end; / Function created //声明绑定变量fun_info SQL> var fun_info varchar2(255); //使用call调用函数将返回值赋值给绑定变量 SQL> call test_fun('a','b') into :fun_info; Method called fun_info --------- ab //显示绑定变量的值 SQL> print fun_info fun_info --------- ab
当然也可以将函数的参数定义为out模式来初始化,我们这里使用call命令调用函数把结果传给绑定变量,
语法:
call function(参数列表) into :绑定变量
pl/sql中的参数和定义的变量(包括全局变量和临时变量)都会内部转为绑定变量,所以尽量在pl/sql中尽量使用静态sql,而不要使用动态sql,如果使用动态sql,要尽量加上绑定变量。
(13).绑定变量的基本作用
绑定变量主要是sql的执行过程中,在解析sql之后会进行共享池(SGA)的检查,看优化器有没有分析优化过这个sql,环境必须完全一致才可以(包括大小写的一致,session情况一致等)。那么可以达到一次分析,多次执行的目的,这就是软解析,否则要经过解析,优化,行资源生成等一系列sql执行的过程,因为sql优化需要耗费很多资源,如果硬解析,sql性能会下降。
如果查询一跑几个小时,根本没必要做绑定变量,因为解析的消耗微乎其微,而且绑定变量对优化器判断执行路径也有负面影响。
看SGA中的sql是否是软解析被调用多次,可以查看v
sql或v
sqlarea视图,查看列sql_text,executions,如:
select sql_text,executions from v$sql where sql_text like '%trademark%'; SQL_TEXT EXECUTIONS<被执行的次数> select * from trademark where id=:tid 6
3、declare
查看Oracle PL/SQL语句基础学习笔记(上)-3、声明部分