admin

从SP调用同一模式内的存储过程

sql

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

但是,如果我改用其他架构,则必须在各处替换该引用。是否有合适的解决方法或更好的解决方案?


阅读 132

收藏
2021-06-07

共1个答案

admin

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

2021-06-07