云数据库 GAUSSDB-CREATE PACKAGE:注意事项

时间:2024-11-13 14:45:53

注意事项

  • 在package specification中声明过的函数或者存储过程,必须在package body中找到定义。
  • 创建存储过程时,仅对CREATE的存储过程或PACKAGE本身加写锁,仅对执行过程中编译、执行会对函数和函数依赖的PACKAGE均加读锁。
  • 在实例化中,无法调用带有commit/rollback的存储过程。
  • 不能在Trigger中调用package函数。
  • 不能在外部SQL中直接使用package当中的变量。
  • 不允许在package外部调用package的私有变量和存储过程。
  • 不支持存储过程不支持的用法,例如,在function中不允许调用commit/rollback,则package的function中同样无法调用commit/rollback。
  • 不支持schema与package同名。
  • 只支持A风格的存储过程和函数定义。
  • 不支持package内有同名变量,包括包内同名参数。
  • package的全局变量为session级,不同session之间package的变量不共享。
  • package中调用自治事务的函数,不允许使用package中的cursor变量,以及不允许递归的使用package中cursor变量的函数。
  • package中不支持声明ref cursor变量。
  • package默认为SECURITY INVOKER权限,如果想将默认行为改为SECURITY DEFINER权限,需要设置guc参数behavior_compat_options='plsql_security_definer'。
  • 被授予CREATE ANY PACKAGE权限的用户,可以在public模式和用户模式下创建PACKAGE。
  • 如果需要创建带有特殊字符的package名,特殊字符中不能含有空格,并且最好设置GUC参数behavior_compat_options="skip_insert_gs_source",否则可能引起报错。
  • package创建时依赖未定义对象,如参数enable_force_create_obj打开,创建可执行,通过WARNING提示;如参数未打开,package创建不可执行。
  • 创建package函数时,其参数默认值支持含有package内变量,不支持跨package变量。
  • package中函数复杂调用,如:func(x).a,函数调用返回复合类型,支持跨schema调用,不支持通过database.schema.package.func(x).b的方式调用。
  • 在创建package内的存储过程时,如果存储过程名称为schema.func或package.func形式,只会获取func的名称,schema声明或package声明无效,如果需要默认禁止这种行为,可以设置GUC参数behavior_compat_options='forbid_package_function_with_prefix'。
  • 在创建PACKAGE内的存储过程时,如果存储过程的入参包含伪类型(如:anyelement),不支持调用时传入变长类型的参数。
  • package内创建的带参数游标,可以跨package进行类型引用(%RowType)和打开使用,有以下限制:
    1. 暂不支持通过database.schema.package.cursor的方式调用游标。
    2. 当游标定义为函数参数时,需要提前设置参数behavior_compat_options='allow_procedure_compile_check',以支持解析游标的具体类型。
    3. 当未设置参数behavior_compat_options='allow_procedure_compile_check'时,cursor%RowType处理成复合类型,即record。设置参数后,支持解析游标的具体类型。
support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0559.html