包实施详细信息位于包正文中;包正文可能包含对包用户不可见的对象。

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不支持这些关键字。