向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中

原文地址:https://www.cnblogs.com/polestar/p/2557699.html