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

时间:2025-03-03 09:49:40

注意事项

  • 如果创建函数时参数或返回值带有精度,不进行精度检测。
  • 创建函数时,函数定义中对表对象的操作建议都显式指定模式,否则可能会导致函数执行异常。
  • 创建存储过程时,仅对CREATE的存储过程或PACKAGE本身加写锁,仅对执行过程中编译、执行会对函数和函数依赖的PACKAGE均加读锁。
  • 在创建函数时,函数内部通过SET语句设置current_schema和search_path无效。执行完函数后的search_path和current_schema与执行函数前的search_path和current_schema保持一致。
  • 如果函数参数中带有出参,想要出参生效,必须打开guc参数 set behavior_compat_options = 'proc_outparam_override'; SELECT、CALL调用函数时,必须要在出参位置提供实参进行调用,否则函数调用失败。
  • 兼容PostgreSQL风格的函数或者带有PACKAGE属性的函数支持重载。在指定REPLACE的时候,如果参数个数、类型、返回值有变化,不会替换原有函数,而是会建立新的函数。
  • 不能创建仅形参名字不同(函数名和参数列表类型都一样)的重载函数。
  • 不能创建与存储过程拥有相同名称和参数列表的函数。
  • 不支持形参仅在自定义ref cursor类型和sys_refcursor类型不同的重载。
  • 不支持仅返回的数据类型不同的函数重载。
  • 不支持仅默认值不同的函数重载。
  • 重载的函数在调用时变量需要明确具体的类型。
  • A兼容模式的数据库,建立A风格的函数;PG兼容的库,建立PG风格的函数。不建议混合创建。
  • 函数如果支持重载,需要添加PACKAGE关键字。
  • 在函数内部使用未声明的变量,函数被调用时会报错。
  • SELECT调用可以指定不同参数来进行同名函数调用。由于语法不支持调用不带有PACKAGE属性的同名函数。
  • 在创建function时,不能在avg函数外面嵌套其他agg函数,或者其他系统函数。
  • 新创建的函数默认会给PUBLIC授予执行权限(详见GRANT)。用户默认继承PUBLIC角色权限,因此其他用户也会有函数的执行权限并可以查看函数的定义,另外执行函数时还需要具备函数所在schema的USAGE权限。用户在创建函数时可以选择收回PUBLIC默认执行权限,然后根据需要将执行权限授予其他用户,为了避免出现新函数能被所有人访问的时间窗口,应在一个事务中创建函数并且设置函数执行权限。开启数据库对象隔离属性后,普通用户只能查看有权限执行的函数定义。
  • 在函数内部调用其它无参数的函数时,可以省略括号,直接使用函数名进行调用。
  • 在函数内部调用其他有出参的函数,如果在赋值表达式中调用时,需要打开guc参数 set behavior_compat_options = 'proc_outparam_override' ,并提前定义与出参类型相同的变量,然后将变量作为出参调用带有出参的其他函数,出参才能生效。否则,被调函数的出参会被忽略。
  • 兼容Oracle风格的函数支持参数注释的查看与导出、导入。
  • 兼容Oracle风格的函数支持介于IS/AS与plsql_body之间的注释的查看与导出、导入。
  • 被授予CREATE ANY FUNCTION权限的用户,可以在用户模式下创建/替换函数。
  • 函数默认为SECURITY INVOKER权限,如果想将默认行为改为SECURITY DEFINER权限,需要设置guc参数behavior_compat_options='plsql_security_definer'。
  • 不打开参数set behavior_compat_options = 'proc_outparam_override'时,被匿名块或存储过程直接调用的函数的OUT、IN OUT出参不能使用复合类型,并且RETURN值会被当做OUT出参的第一个值导致调用失败,想正确使用OUT、IN OUT出参,需打开参数set behavior_compat_options = 'proc_outparam_override',见示例
  • 对于PL/SQL函数,打开参数behavior_compat_options='proc_outparam_override'后,out/inout的行为会改变,函数中同时返回return和out/inout,而参数打开前仅返回return,见示例
  • 对于PL/SQL函数,打开参数behavior_compat_options='proc_outparam_override'后,有以下限制:
    1. 如果同一schema和package中已存在带有out/inout参数函数,不能再次创建带有out/inout参数的同名函数。
    2. 无论使用select还是call调用存储过程,都必须加上out参数。
    3. 部分场景不支持函数参与表达式(与参数打开前相比),如存储过程中左赋值,call function等,见示例
    4. 不支持调用无return的函数,perform function调用。
    5. 存储过程中调用函数,不支持out/inout参数传入常量,可以传入变量,见示例
    6. 打开GUC参数proc_outparam_override后,函数返回值为setof类型时,out出参不会生效。
support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0548.html