调用相同的架构内的存储过程从SP(Calling a stored procedures withi

2019-09-23 02:41发布

我如何可以调用在同一架构中的存储过程无需编码另一个存储过程时指定完整的架构名称。 这是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

它会抛出:

没有授权的常规命名类型 “程序” 使用兼容参数的 “SP_TEST” 被发现.. SQLCODE = -440,SQLSTATE = 42884,DRIVER = 3.53.71

直接给全模式名的作品:

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

但是如果我移动到一个不同的模式,我将不得不更换引用所有的地方。 是否有一个合适的解决办法或更好的解决问题的办法?

Answer 1:

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



Answer 2:

Ommitting架构名称气馁。 保持你的架构名称在您的来电。 如果你到一个不同的模式,你必须通过提取/无论如何改变SQL脚本来做到这一点。



Answer 3:

SET SCHEMA命令允许你改变当前模式:

SET CURRENT SCHEMA FOO;
CALL MY_PROC_THAT_RESIDES_IN_FOO();

它也不是那么容易使用的模式设置为动态值,虽然。 你将不得不之一:

  1. 做主机变量的东西(如果你是一个调用应用程序内)或
  2. 建立和执行动态SQL语句字符串。

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

更多信息可在找到的文件SET SCHEMA命令 。



文章来源: Calling a stored procedures within the same schema from a SP