包實施詳細信息位于包正文中;包正文可能包含對包用戶不可見的對象。
PolarDB支持包正文的以下語法:
CREATE [ OR REPLACE ] PACKAGE BODY package_name
{ IS | AS }
[ private_declaration; ] ...
[ procedure_or_function_definition ] ...
[ package_initializer ]
[ package_name ] ;
其中
procedure_or_function_definition :=
procedure_definition | function_definition
其中
procedure_definition :=
PROCEDURE proc_name[ argument_list ]
[ options_list ]
{ IS | AS }
procedure_body
END [ proc_name ] ;
其中
procedure_body :=
[ declaration; ] [, ...]
BEGIN
statement; [...]
[ EXCEPTION
{ WHEN exception [OR exception] [...]] THEN statement; }
[...]
]
其中
function_definition :=
FUNCTION func_name [ argument_list ]
RETURN rettype [DETERMINISTIC]
[ options_list ]
{ IS | AS }
function_body
END [ func_name ] ;
其中
function_body :=
[ declaration; ] [, ...]
BEGIN
statement; [...]
[ EXCEPTION
{ WHEN exception [ OR exception ] [...] THEN statement; }
[...]
]
其中
argument_list :=
( argument_declaration [, ...] )
其中
argument_declaration :=
argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
其中
options_list :=
option [ ... ]
其中
option :=
STRICT
LEAKPROOF
COST execution_cost
ROWS result_rows
SET config_param { TO value | = value | FROM CURRENT }
其中
package_initializer :=
BEGIN
statement; [...]
END;
參數
參數 | 說明 |
---|---|
package_name | package_name 是包正文所屬的包的名稱。必須存在具有此名稱的包規格。 |
private_declaration | private_declaration 是可由包中任意過程或函數訪問的私有變量的標識符。可以有零個、一個或多個私有變量。private_declaration 可以為以下任意值之一:
|
proc_name | 要創建的過程的名稱。 |
PRAGMA AUTONOMOUS_TRANSACTION | PRAGMA AUTONOMOUS_TRANSACTION 是將過程設置為自治事務的指令。 |
declaration | 變量、類型、REF CURSOR 或子程序聲明。如果包括子程序聲明,則它們必須放在所有其他變量、類型和 REF CURSOR 聲明之后。 |
statement | SPL 程序語句。請注意,DECLARE - BEGIN - END 塊被視為 SPL 語句本身。因此,函數正文可以包含嵌套塊。 |
exception | 異常條件名稱,如 NO_DATA_FOUND、OTHERS 等。 |
func_name | 要創建的函數的名稱。 |
rettype | 返回數據類型,可以是為 argtype 列出的任意類型。對于 argtype,不得為 rettype 指定長度。 |
DETERMINISTIC | 包括 DETERMINISTIC 以指定在提供相同參數值時,函數將始終返回相同結果。DETERMINISTIC 函數不能修改數據庫。
說明
|
PRAGMA AUTONOMOUS_TRANSACTION | PRAGMA AUTONOMOUS_TRANSACTION 是將函數設置為自治事務的指令。 |
declaration | 變量、類型、REF CURSOR 或子程序聲明。如果包括子程序聲明,則它們必須放在所有其他變量、類型和 REF CURSOR 聲明之后。 |
argname | 形參的名稱。參數在過程正文中通過該名稱進行引用。 |
IN | IN OUT | OUT | 參數模式。IN 聲明參數僅用于輸入。這是默認值。IN OUT 允許參數接收值和返回值。OUT 指定參數僅用于輸出。 |
argtype | 參數的數據類型。參數類型可以是基本數據類型、使用 %TYPE 的現有列的類型副本,或者是用戶定義的類型,例如嵌套表或對象類型。不能為任何基本類型指定長度,例如,指定 VARCHAR2 而不是 VARCHAR2(10)。 列的類型通過編寫 tablename.columnname%TYPE 來引用,使用此格式有時候能夠幫助存儲過程獨立于表定義的變化。 |
DEFAULT value | 如果在過程調用中未提供輸入參數,則 DEFAULT 子句為輸入參數提供默認值。不能為具有模式 IN OUT 或 OUT 的參數指定 DEFAULT。
說明 以下選項不兼容 Oracle 數據庫;它們是僅由PolarDB提供的對 Oracle 包語法的擴展。
|
STRICT | STRICT 關鍵字指定在使用 NULL 參數調用函數時將不執行函數;相反,函數將返回 NULL。 |
LEAKPROOF | LEAKPROOF 關鍵字指定除了返回值之外,函數不會公開有關參數的任何信息。 |
PARALLEL { UNSAFE | RESTRICTED | SAFE } | 通過 PARALLEL 子句可以使用并行順序掃描(并行模式)。在查詢期間,相比串行順序掃描,并行順序掃描使用多個工作線程并行掃描一個關系。
|
execution_cost | execution_cost 指定一個正數,提供函數的估計執行成本,單位為 cpu_operator_cost。如果函數返回一個集,則這是每個返回行的成本。默認值為 0.0025。 |
result_rows | result_rows 是查詢計劃程序預期函數返回的估計行數。默認值為 1000。 |
SET | 使用 SET 子句可以為函數的持續時間指定參數值:
|
package_initializer | package_initializer 中的語句在首次引用包時,對每個用戶會話執行一次。 |
說明 STRICT、LEAKPROOF、PARALLEL、COST、ROWS和SET關鍵字可以為PolarDB提供擴展功能,但Oracle不支持這些關鍵字。