在DB2 v8中检测和使用CURRENT SCHEMA

时间:2011-08-24 15:38:34

标签: stored-procedures db2 schema

我在iSeries DB2 v8中有一个非常大的存储过程,它执行以下操作:

  • 在同一架构中调用其他存储过程
  • 从字符串准备动态sql状态并运行它们
  • 从同一架构调用其他函数
  • 使用同一架构中的各种表

我的问题是这个存储过程和附带的函数可能会从该模式变为另一个模式(即从'superlib'变为'restorelib'),并且整个代码当前都是硬编码的,以便与命名模式一起运行。

我想要的是能够执行以下两种方法之一:通过参数将所有内容所在的模式名称传递给存储过程,或让存储过程检测模式的名称并使用它自己跑。

这是我当前代码的示例:

SELECT COUNT(*) INTO TotalNotDone FROM superlib.PROCESSTABLES WHERE PROCESS_FLAG < 1; 
WHILE TotalNotDone > 0 DO 
SET SQLLOOPSTMT = 'select name_to_proces from ' CONCAT SOURCELIBRARY CONCAT '.processtables where process_flag = 0' ; 

PREPARE LOOPSTMT FROM SQLLOOPSTMT ; 
OPEN LOOPCUR ; 
FETCH LOOPCUR INTO TABLETOPROCESS ; 

CALL superlib.SP_RESTORE_INSERTS ( SOURCELIBRARY , DESTLIBRARY , TABLETOPROCESS, P_STARTTIME ) ;

CLOSE LOOPCUR;
SELECT COUNT(*) INTO TotalNotDone FROM superlib.PROCESSTABLES WHERE PROCESS_FLAG < 1;  
END WHILE ;

我想要的是 NOT 必须在存储过程中编写superlib来调用或引用我正在使用的表,只是让存储过程识别它当前正在生存在架构superlib中。

我已经尝试SET CURRENT SCHEMA = 'SUPERLIB';SET SCHEMA = 'SUPERLIB';,但在调用TABLES时都不起作用。

我在创建存储过程时也改变了路径:

SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","PROGUSER1" ; 

SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","SUPERLIB" ; 

但显然什么也没做。

1 个答案:

答案 0 :(得分:0)

我相信您需要在调用存储过程的连接上设置current path,而不仅仅是在创建它时。

请参阅:Weblogic: Call DB2 stored procedure without schema name (property currentSchema)

current path文档:http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/r0005877.htm