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

  • 相关阅读:
    CCI_Q1.5
    CCI_Q1.4
    js 记录一次日期转换
    列表注册自定义鼠标右键事件
    jquery点击页面其他位置隐藏div
    C#一句话判断两个List<T>是否相等
    使用Js进行linq处理
    记录一次DataTable排序的问题
    JavaScript模板引擎Handlebars
    Redis学习笔记
  • 原文地址:https://www.cnblogs.com/polestar/p/2557699.html
Copyright © 2020-2023  润新知