向plsql匿名快传递参数及日志重定向
PL/SQL是一种编译型语言,所以这些代码块在执行之前必须经过编译器的处理。编译是一个检查过程,这个过程能够确保代码中引用的对象存在以及语句具有正确的语法。代码在编译过程完成后可以运行,但是必须在PL/SQL引擎内运行。
PL/SQL代码块具有两种形式:匿名块与命名块。匿名(anonymous)PL/SQL代码块是头部不具有名称的PL/SQL代码。此时,我们可以通过诸如SQL*Plus之类的交互式工具将匿名块发送至PL/SQL引擎,这些代码块随后会立即运行。须要记住的是,PL/SQL是一种编译型语言,因此匿名块会被编译并运行,随后则会消失。如果希望再次进行运行,则必须将完整的代码块再次发送至PL/SQL引擎,这些代码在PL/SQL引擎内会再次被编译并运行,随后又会消失。为了更易于再次运行,匿名块可以被存储至操作系统的脚本文件中。
向匿名快传递参数:向匿名块脚本传递参数与向纯sql脚本传递参数相同。即匿名快中接收参数的变量必须为&1,&2.....等等。如匿名块脚本接收参数的变量为:&a,&b.....时,在直接调用匿名块脚本时传递的参数无效,sqlplus会提示重新输入。
1 示例: 2 SQL> @/home/tmn/zhaoxj/test.sql hello 3 SQL> DECLARE 4 2 v_partition varchar2(32) :=Partition; -- v_partition varchar2(32) := '&Partition'
5 3 BEGIN
6 4 DBMS_OUTPUT.PUT_LINE(&Partition);
7 5 END;
8 6 /
9 Enter value for partition: hello
10 old 4: DBMS_OUTPUT.PUT_LINE(&Partition);
11 new 4: DBMS_OUTPUT.PUT_LINE(hello);
12 hello
13 SQL>
脚本后面的参数hello最初并没有传进来。解决办法:将&Partition改为&1即可.
1 SQL> @/home/tmn/zhaoxj/test.sql hello 2 SQL> DECLARE 3 2 v_partition varchar2(32)='&1' ; 4 3 BEGIN 5 4 DBMS_OUTPUT.PUT_LINE(&1); 6 5 END; 7 6 / 8 old 4: DBMS_OUTPUT.PUT_LINE(&1); 9 new 4: DBMS_OUTPUT.PUT_LINE(hello); 10 hello 11 SQL>
由此可见plsql匿名块接收参数与纯sql脚本接收参数相同。
利用spool将plsql输出重定向到指定文件:
1 spool /home/tmn/zhaoxj/logdir/week/&1.log 2 DECLARE 3 v_partition varchar2(32) := '&1'; 4 v_date varchar2(32) := '&2';--当前汇总日期 5 v_monday varchar2(32) := '&3'; --星期一的具体日期 6 v_flag number := &4; --判断时间是否为星期一 7 BEGIN 8 DBMS_OUTPUT.PUT_LINE(v_partition); 9 DBMS_OUTPUT.PUT_LINE(v_date); 10 DBMS_OUTPUT.PUT_LINE(v_monday); 11 DBMS_OUTPUT.PUT_LINE(v_flag); 12 END; 13 / 14 spool off
测试结果:
1 SQL> @/home/tmn/zhaoxj/test.sql P_1D_20120620 2012-06-20 2012-06-18 3 2 SQL> spool /home/tmn/zhaoxj/logdir/week/&1.log 3 SQL> DECLARE 4 2 v_partition varchar2(32) := '&1'; 5 3 v_date varchar2(32) := '&2';--当前汇总日期 6 4 v_monday varchar2(32) := '&3'; --星期一的具体日期 7 5 v_flag number := &4; --判断时间是否为星期一 8 6 BEGIN 9 7 DBMS_OUTPUT.PUT_LINE(v_partition); 10 8 DBMS_OUTPUT.PUT_LINE(v_date); 11 9 DBMS_OUTPUT.PUT_LINE(v_monday); 12 10 DBMS_OUTPUT.PUT_LINE(v_flag); 13 11 END; 14 12 / 15 old 2: v_partition varchar2(32) := '&1'; 16 new 2: v_partition varchar2(32) := 'P_1D_20120620'; 17 old 3: v_date varchar2(32) := '&2';--当前汇总日期 18 new 3: v_date varchar2(32) := '2012-06-20';--当前汇总日期 19 old 4: v_monday varchar2(32) := '&3'; --星期一的具体日期 20 new 4: v_monday varchar2(32) := '2012-06-18'; --星期一的具体日期 21 old 5: v_flag number := &4; --判断时间是否为星期一 22 new 5: v_flag number := 3; --判断时间是否为星期一 23 P_1D_20120620 24 2012-06-20 25 2012-06-18 26 3 27 28 PL/SQL procedure successfully completed. 29 30 SQL> 31 SQL> spool off
以上内容全部会输入到 /home/tmn/zhaoxj/logdir/week/P_1D_20120620.log中