从 SP 调用同一架构中的存储过程



如何在编码另一个存储过程时调用同一架构中的存储过程而不指定完整的架构名称。这些是 DB2 中的 SQL PL 过程。

第一个 SP:

CREATE PROCEDURE MYSCHEMA.SP_TEST
  LANGUAGE SQL
  BEGIN
  END

创建直接调用此 SP 而不使用架构名称的 SP 会导致编译错误:

CREATE PROCEDURE MYSCHEMA.SP_TEST2
  LANGUAGE SQL
  BEGIN
    CALL SP_TEST();
  END

它将抛出:

未找到具有兼容参数的名为"PROCEDURE"类型的名为"SP_TEST"的授权例程。SQLCODE=-440, SQLSTATE=42884, DRIVER=3.53.71

直接给出完整的模式名称有效:

CREATE PROCEDURE MYSCHEMA.SP_TEST2
  LANGUAGE SQL
  BEGIN
    CALL MYSCHEMA.SP_TEST();
  END

但是,如果我移动到不同的架构,我将不得不到处替换该引用。是否有合适的解决方法或更好的解决方案?

CURRENT PATH特殊寄存器用于解析对非限定存储过程和函数的调用。 CURRENT SCHEMA用于解析非限定对象名称。

默认情况下,CURRENT PATH具有 IBM 函数和 AUTHID:

$ db2 "values substr(current path,1,60)"
1
------------------------------------------------------------
"SYSIBM","SYSFUN","SYSPROC","SYSIBMADM","IBJORHOV"
  1 record(s) selected.

您可以使用 SET CURRENT PATH 语句对其进行修改。

创建存储过程时,DB2 会在编译时记下 CURRENT PATH 的值,并使用它们来解析存储过程中的非限定存储过程和函数调用。 相同的逻辑适用于CURRENT SCHEMA和非限定表名。

因此,允许在存储过程中调用非限定过程和函数的正确方法是设置CURRENT PATH寄存器,然后创建过程。

不鼓励省略架构名称。在调用中保留架构名称。如果移动到其他架构,则必须通过提取/更改 SQL 脚本来执行此操作。

SET SCHEMA 命令允许您更改当前架构:

SET CURRENT SCHEMA FOO;
CALL MY_PROC_THAT_RESIDES_IN_FOO();

但是,使用将架构设置为动态值并不容易。 您必须:

  1. 对主机变量执行某些操作(如果您在调用应用程序中)或
  2. 生成并执行动态 SQL 语句字符串。

在这一点上,它可能变得比它的价值更麻烦。

有关详细信息,请参阅 SET SCHEMA 命令的文档。

最新更新