向plsql匿名快傳遞引數及日誌重定向

2021-09-08 16:18:32 字數 3700 閱讀 9083

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

42 v_partition varchar2(32) :=

partition

; -- v_partition varchar2(32) := '&partition'53

begin

64 dbms_output.put_line(&partition); 75

end; 86

/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

32 v_partition varchar2(32)='&1

';43

begin

54 dbms_output.put_line(&1);

65end;76

/8 old 4: dbms_output.put_line(&1);

9 new 4

: dbms_output.put_line(hello);

10hello

11 sql>

由此可見plsql匿名塊接收引數與純sql指令碼接收引數相同。

利用spool將plsql輸出重定向到指定檔案

1 spool /home/tmn/zhaoxj/logdir/week/&

1.log

2declare

3 v_partition varchar2(32) :='&1

';4 v_date varchar2(32) :='&2

';--

當前彙總日期

5 v_monday varchar2(32) :='&3

'; --

星期一的具體日期

6 v_flag number :=

&4; --

判斷時間是否為星期一

7begin

8dbms_output.put_line(v_partition);

9dbms_output.put_line(v_date);

10dbms_output.put_line(v_monday);

11dbms_output.put_line(v_flag);

12end;13

/14 spool off

測試結果:

1 sql>  @/home/tmn/zhaoxj/test.sql p_1d_20120620 2012-06

-202012-06

-1832 sql> spool /home/tmn/zhaoxj/logdir/week/&

1.log

3 sql>

declare

42 v_partition varchar2(32) :='&1

';53 v_date varchar2(32) :='&2

';--

當前彙總日期

64 v_monday varchar2(32) :='&3

'; --

星期一的具體日期

75 v_flag number :=

&4; --

判斷時間是否為星期一86

begin97

dbms_output.put_line(v_partition);108

dbms_output.put_line(v_date);119

dbms_output.put_line(v_monday);

1210

dbms_output.put_line(v_flag);

1311

end;

1412

/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; --

判斷時間是否為星期一

23p_1d_20120620

242012-06

-20252012-06

-18263

2728 pl/sql procedure

successfully completed.

2930 sql>

31 sql> spool off

以上內容全部會輸入到 /home/tmn/zhaoxj/logdir/week/p_1d_20120620.log中

向指令碼傳遞引數

start 在需要的時候我們可以向 perl 指令碼傳遞引數,perl 會自動將所有的引數放到陣列 argv 中,下面是乙個簡單的例子。usr bin perl use strict if argv 1 my name argv print welcome name n unix 的 cat 命令可...

向指令碼傳遞引數

1.使用 pg opt.sh bin sh opt.sh usage opt 1 processid 1 if ne 2 then usage exit 1 ficase opt in start start echo starting.processid stop stop echo stoppi...

KingbaseES 匿名塊如何傳遞引數

匿名塊的基本語法結構包括宣告和執行兩部分。匿名塊每次提交都被重新編譯和執行。因為匿名塊沒有名稱並不在資料庫中儲存,所以匿名塊不能直接從其他pl sql 塊中呼叫。定義語法 declare variable declaration cursor declaration begin sequence o...