定義新的包正文。
語法
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 | 輸入參數的默認值。 |
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 子句可以為函數的持續時間指定參數值:
|
program_body | 構成函數或存儲過程的主體的 pragma、聲明和 SPL 語句。 Pragma 可以為 PRAGMA AUTONOMOUS_TRANSACTION,這會將函數或存儲過程設置為自治事務。 聲明可以包括變量、類型、REF CURSOR 或子程序聲明。如果包括子程序聲明,則它們必須在所有其他變量、類型和 REF CURSOR 聲明之后。 |
func_name | 公共函數或私有函數的名稱。如果包規格中存在具有相同簽名的 func_name,則它為公共,否則為私有。 |
rettype | 返回數據類型。 |
DETERMINISTIC | 包括 DETERMINISTIC 以指定在提供相同參數值時,函數將始終返回相同結果。DETERMINISTIC 函數不可修改數據庫。 說明
|
statement | 一個 SPL 程序語句。首次引用包時,包初始化部分中的語句會對每個會話執行一次。 |
說明
STRICT
、LEAKPROOF
、PARALLEL
、COST
、ROWS
和 SET
關鍵字可以為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