定義新的包正文。

語法

CREATE [ OR REPLACE ] PACKAGE BODY name
{ IS | AS }
  [ declaration; ] [, ...]
  [ { PROCEDURE proc_name
      [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
        [, ...]) ]
      [ STRICT ]
      [ LEAKPROOF ]
      [ PARALLEL { UNSAFE | RESTRICTED | SAFE } ]
      [ COST execution_cost ]
      [ ROWS result_rows ]
      [ SET config_param { TO value | = value | FROM CURRENT } ]
    { IS | AS }
        program_body
      END [ proc_name ];
    |
      FUNCTION func_name
      [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
        [, ...]) ]
      RETURN rettype [ DETERMINISTIC ]
      [ STRICT ]
      [ LEAKPROOF ]
      [ PARALLEL { UNSAFE | RESTRICTED | SAFE } ]
      [ COST execution_cost ]
      [ ROWS result_rows ]
      [ SET config_param { TO value | = value | FROM CURRENT } ]
    { IS | AS }
        program_body
      END [ func_name ];
    }
  ] [, ...]
  [ BEGIN
      statement; [, ...] ]
  END [ name ]

說明

CREATE PACKAGE BODY 定義新的包正文。CREATE OR REPLACEPACKAGE BODY 將創建新的包正文,或者替換現有正文。

如果包括 schema 名稱,則在指定的 schema 中創建包正文。否則在當前 schema 中創建。新的包正文的名稱必須與相同 schema 中的現有包規格匹配。在同一個 schema 中,新的包正文名稱不能匹配任何現有包正文,除非其目的是更新現有包正文的定義,在這種情況下使用 CREATE OR REPLACE PACKAGE BODY

參數

參數說明
name要創建的包正文的名稱(可能是 schema 限定的)。
declaration私有變量、類型、游標或 REF CURSOR 聲明。
proc_name公共存儲過程或私有存儲過程的名稱。如果包規格中存在具有相同簽名的 proc_name,則它為公共,否則為私有。
argname參數的名稱。
IN | IN OUT | OUT參數模式。
argtype程序的參數的數據類型。
DEFAULT value輸入參數的默認值。
STRICTSTRICT 關鍵字指定在使用 NULL 參數調用函數時將不執行函數;相反,函數將返回 NULL。
LEAKPROOFLEAKPROOF 關鍵字指定除了返回值之外,函數不會公開有關參數的任何信息。
PARALLEL { UNSAFE | RESTRICTED | SAFE }通過 PARALLEL 子句可以使用并行順序掃描(并行模式)。在查詢期間,相比串行順序掃描,并行順序掃描使用多個工作線程并行掃描一個關系。
  • 設置為 UNSAFE 時,存儲過程或函數不能以并行模式執行。存在此類存儲過程或函數時,會強制執行串行執行計劃。如果省略 PARALLEL 子句,則這是默認設置。
  • 設置為 RESTRICTED 時,存儲過程或函數可以按并行模式執行,但執行限制為并行組中的前幾個。如果任何特定關系的限定條件具有存在并行限制的任何內容,則不會為并行執行選擇該關系。
  • 設置為 SAFE 時,存儲過程或函數可以按并行模式執行,沒有任何限制。
execution_costexecution_cost 指定一個正數,提供函數的估計執行成本,單位為 cpu_operator_cost。如果函數返回一個集合,則這是每個返回行的成本。默認值為 0.0025。
result_rowsresult_rows 是查詢計劃程序預計函數返回的估計行數。默認值為 1000。
SET使用 SET 子句可以為函數的持續時間指定參數值:
  • config_param 指定參數名稱。
  • value 指定參數值。
  • FROM CURRENT 確保在函數結束時還原參數值。
program_body構成函數或存儲過程的主體的 pragma、聲明和 SPL 語句。

Pragma 可以為 PRAGMA AUTONOMOUS_TRANSACTION,這會將函數或存儲過程設置為自治事務。

聲明可以包括變量、類型、REF CURSOR 或子程序聲明。如果包括子程序聲明,則它們必須在所有其他變量、類型和 REF CURSOR 聲明之后。

func_name公共函數或私有函數的名稱。如果包規格中存在具有相同簽名的 func_name,則它為公共,否則為私有。
rettype返回數據類型。
DETERMINISTIC包括 DETERMINISTIC 以指定在提供相同參數值時,函數將始終返回相同結果。DETERMINISTIC 函數不可修改數據庫。
說明
  • DETERMINISTIC 關鍵字等同于 PostgreSQL IMMUTABLE 選項。
  • 如果在包正文中為公共函數指定了 DETERMINISTIC,則還必須在包規格中為函數聲明指定該關鍵字。對于私有函數,包規格中沒有函數聲明。
statement一個 SPL 程序語句。首次引用包時,包初始化部分中的語句會對每個會話執行一次。
說明 STRICTLEAKPROOFPARALLELCOSTROWSSET 關鍵字可以為PolarDB PostgreSQL版(兼容Oracle)提供擴展功能,但 Oracle 不支持這些關鍵字。

示例

下面是 empinfo 包的包正文。

CREATE OR REPLACE PACKAGE BODY empinfo
IS
    v_counter       INTEGER;
    PROCEDURE get_name (
        p_empno     NUMBER
    )
    IS
    BEGIN
        SELECT ename INTO emp_name FROM emp WHERE empno = p_empno;
        v_counter := v_counter + 1;
    END;
    FUNCTION display_counter
    RETURN INTEGER
    IS
    BEGIN
        RETURN v_counter;
    END;
BEGIN
    v_counter := 0;
    DBMS_OUTPUT.PUT_LINE('Initialized counter');
END;

以下兩個匿名塊執行 empinfo 包中的存儲過程和函數并顯示公共變量。

BEGIN
    empinfo.get_name(7369);
    DBMS_OUTPUT.PUT_LINE('Employee Name    : ' || empinfo.emp_name);
    DBMS_OUTPUT.PUT_LINE('Number of queries: ' || empinfo.display_counter);
END;

已初始化計數器
員工姓名:SMITH
查詢數:1

BEGIN
    empinfo.get_name(7900);
    DBMS_OUTPUT.PUT_LINE('Employee Name    : ' || empinfo.emp_name);
    DBMS_OUTPUT.PUT_LINE('Number of queries: ' || empinfo.display_counter);
END;

員工姓名:JAMES
查詢數:2