包实施详细信息位于包正文中;包正文可能包含对包用户不可见的对象。
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不支持这些关键字。