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

时间:2024-07-01 18:37:39

注意事项

  • 如果创建存储过程时参数或返回值带有精度,不进行精度检测。
  • 创建存储过程时,存储过程定义中对表对象的操作建议都显示指定模式,否则可能会导致存储过程执行异常。
  • 创建存储过程时,仅对CREATE的存储过程本身加写锁,仅对执行过程中编译、执行会对函数均加读锁。
  • 创建存储过程时,存储过程内部通过SET语句设置current_schema和search_path无效。执行完函数search_path和current_schema与执行函数前的search_path和current_schema保持一致。
  • SELECT、CALL调用函数时,必须要在出参位置提供实参进行调用,实参不会发生作用。
  • 不能创建仅形参名字不同(存储过程名和参数列表类型都一样)的重载存储过程。
  • 不能创建与函数拥有相同名称和参数列表的存储过程。
  • 不支持仅默认值不同的存储过程重载。
  • 存储过程仅in、out、inout这三种类型不同的参数,打开GUC参数behavior_compat_options(behavior_compat_options='proc_outparam_override')后,不允许重载。关闭该参数后,可以重载。
  • ORA兼容模式的数据库,建立ORA风格的函数;PG兼容模式的数据库,建立PG风格的函数。不建议混合创建。
  • 重载的存储过程在调用时变量需要明确具体的类型。
  • 在存储过程内部使用未声明的变量,存储过程被调用时会报错。
  • 在创建procedure时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。
  • 函数定义时如果指定为IMMUTABLE和SHIPPABLE类型,应该尽量避免函数中存在INSERT,UPDATE,DELETE,MERGE和DDL操作,因为上述操作应该由CN判断对应的执行节点,否则执行结果可能产生错误。
  • 存储过程中不支持需要return集合的操作。
  • 在存储过程内部调用其它无参数的存储过程时,可以省略括号,直接使用存储过程名进行调用。
  • 在存储过程内部调用其他有出参的函数,如果在赋值表达式中调用时,需要打开guc参数 set behavior_compat_options = 'proc_outparam_override' ,并提前定义与出参类型相同的变量,然后将变量作为出参调用带有出参的其他函数,出参才能生效。否则,被调函数的出参会被忽略。
  • 存储过程支持参数注释的查看与导出、导入。
  • 存储过程支持介于IS/AS与plsql_body之间的注释的查看与导出、导入。
  • 被授予CREATE ANY FUNCTION权限的用户,可以在用户模式下创建/替换存储过程。
  • out/inout参数必须传入变量,不能传入常量。
  • 存储过程默认为SECURITY INVOKER权限,如果想将默认行为改为SECURITY DEFINER权限,需要设置guc参数behavior_compat_options='plsql_security_definer'。
  • 存储过程创建时依赖未定义对象,如参数behavior_compat_options='plpgsql_dependency'打开,创建可执行,通过WARNING提示;如参数未打开,存储过程创建不可执行。
  • 当打开三权分立时,对于定义者权限的存储过程,只能由本用户自己重建。
  • 如果将定义者权限的存储过程创建到其他用户Schema下,则会以其他用户的权限执行该存储过程,有越权风险,请谨慎使用。
  • 在表达式中使用out参数作为出参时,如下情况不会生效,例如:使用execute immediate sqlv using func语法执行函数、使用select func into语法执行函数、使用insert、update等DML语句执行以及带out出参的函数作为入参时,fun(func(out b),a),out出参b未生效等。
  • 在存储过程内部函数复杂调用,如:func(x).a,函数调用返回复合类型,支持跨schema调用,不支持通过database.schema.func(x).b的方式调用。
  • 调用带out出参的存储过程,设置GUC参数set behavior_compat_options = 'proc_outparam_transfer_length'后可以传递参数长度。规格限制如下:
    1. 支持的基本类型包括:CHAR(n)、CHARACTER(n)、NCHAR(n)、VARCHAR(n)、VARYING(n)、VARCHAR2(n)、NVARCHAR2(n)。
    2. out出参不生效的情况下(比如perform)不需要传递长度。
    3. 不支持精度传递的基本类型包括:NUMERIC、DECIMAL、NUMBER、FLOAT、DEC、INTEGER、TIME、TIMESTAMP、INTERVAL、TIME WITH TIME ZONE、TIMESTAMP WITH TIME ZONE、TIME WITHOUT TIME ZONE、TIMESTAMP WITHOUT TIME ZONE。
    4. 无论GUC参数set behavior_compat_options是否设置为proc_outparam_override都支持传递参数长度。
  • 函数中存在通过GUC参数控制特性的语法、函数等,如果在会话内更改相关GUC参数,修改参数后,调用函数可能会维持修改前的行为,请谨慎变更GUC参数。
support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-12-0558.html