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...