2

在编码另一个存储过程时,如何在不指定完整模式名称的情况下调用同一模式中的存储过程。这些是 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

但是,如果我移动到不同的模式,我将不得不在整个地方替换这些引用。是否有合适的解决方法或更好的解决方案?

4

3 回答 3

2

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寄存器,然后创建过程。

于 2012-09-28T16:29:34.267 回答
1

不鼓励省略 SCHEMA 名称。在您的调用中保留您的架构名称。如果您移动到不同的模式,则无论如何都必须通过提取/更改 SQL 脚本来执行此操作。

于 2012-09-27T09:08:24.730 回答
1

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

SET CURRENT SCHEMA FOO;
CALL MY_PROC_THAT_RESIDES_IN_FOO();

但是,将模式设置为动态值并不容易。您将不得不:

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

到那时,它可能变得比它的价值更麻烦。

更多信息可以在命令的文档中SET SCHEMA找到。

于 2012-09-27T11:24:27.263 回答