包實施詳細信息位于包正文中;包正文可能包含對包用戶不可見的對象。

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 可以為以下任意值之一:
  • 變量聲明
  • 記錄聲明
  • 集合聲明
  • REF CURSOR 和游標變量聲明
  • TYPE 定義(對于記錄、集合和 REF CURSOR)
  • 異常
  • 對象變量聲明
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 函數不能修改數據庫。
說明
  • DETERMINISTIC 關鍵字等同于 PostgreSQL IMMUTABLE 選項。
  • 如果在包正文中為公共函數指定了 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 子句可以使用并行順序掃描(并行模式)。在查詢期間,相比串行順序掃描,并行順序掃描使用多個工作線程并行掃描一個關系。
  • 設置為 UNSAFE 時,過程或函數不能以并行模式執行。存在此類過程或函數時,會強制執行串行執行計劃。如果省略 PARALLEL 子句,則這是默認設置。
  • 設置為 RESTRICTED 時,過程或函數可以按并行模式執行,但執行范圍限制為并行組中的前幾個。如果任何特定關系的限定條件具有存在并行限制的任何內容,則不會為并行執行選擇該關系。
  • 設置為 SAFE 時,過程或函數可以在并行模式下執行,沒有任何限制。
execution_cost execution_cost 指定一個正數,提供函數的估計執行成本,單位為 cpu_operator_cost。如果函數返回一個集,則這是每個返回行的成本。默認值為 0.0025。
result_rows result_rows 是查詢計劃程序預期函數返回的估計行數。默認值為 1000。
SET 使用 SET 子句可以為函數的持續時間指定參數值:
  • config_param 指定參數名稱。
  • value 指定參數值。
  • FROM CURRENT 確保在函數結束時還原參數值。
package_initializer package_initializer 中的語句在首次引用包時,對每個用戶會話執行一次。
說明 STRICT、LEAKPROOF、PARALLEL、COST、ROWS和SET關鍵字可以為PolarDB提供擴展功能,但Oracle不支持這些關鍵字。