У меня очень большая хранимая процедура в iSeries DB2 v8, которая выполняет следующие действия:
- Вызывает другие хранимые процедуры в той же схеме
- Готовит динамические SQL-отчеты из строк и запускаетthem
- Вызывает другие функции из той же схемы
- Использует различные таблицы из той же схемы
Моя проблема в том, что эта хранимая процедура и сопутствующие функции могут измениться сэта схема в другую (т. е. от '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 ;
Я хочу, чтобы НЕ написал superlib
внутри хранимой процедуры, чтобы вызвать или сослаться на таблицы, которые я использую, и просто сохранить хранимую процедуру распознает ее в настоящее время живёт в схеме superlib
.
Я пробовал SET CURRENT SCHEMA = 'SUPERLIB';
и SET SCHEMA = 'SUPERLIB';
, нони один из них не работает при вызове TABLES.
Я также изменил путь при создании хранимой процедуры с:
SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","PROGUSER1" ;
на
SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","SUPERLIB" ;
, но это, очевидно, делаетнет ничего.