Я пытаюсь написать хранимую процедуру в DB2 для AS400, которая выполняет запрос к локальной базе данных (такой же, где процедура хранится; она называется DBLocale
), а другую - в удаленной базе данных (давайте назовите это DBRemoto
). В Навигаторе iSeries я вижу, как они выбирают узел «База данных».
Я пробовал что-то с CONNECT TO DBRemoto;
и / или SET CONNECTION DBRemoto;
, но получил странные результаты: «соединение уже существует», «соединение не существует», «инструкция CALL выполнена» (но без набора результатов) и т. Д.
Это то, что я ожидаю сделать:
CREATE PROCEDURE MYLIB.TEST_CONNECT_INSIDE_PROCEDURE
DYNAMIC RESULT SETS 1
LANGUAGE SQL
READS SQL DATA
BEGIN
DECLARE sql_string VARCHAR(1024) DEFAULT '';
DECLARE locale INT DEFAULT -1;
DECLARE remoto INT DEFAULT -1;
DECLARE cur CURSOR FOR stmt;
DECLARE curOut CURSOR FOR select locale, remoto from SYSIBM.SYSDUMMY1;
-- run the same query in both DBs; I checked, results must be different
SET sql_string = 'select count(*) as QTY from MYLIB.MYTABLE';
-- run locally
CONNECT TO DBLocale; --it's one of my attempts
PREPARE stmt FROM sql_string;
OPEN cur;
FETCH cur INTO locale;
CLOSE cur;
-- run remotely
CONNECT TO DBRemoto; --it's one of my attempts
PREPARE stmt FROM sql_string;
OPEN cur;
FETCH cur INTO remoto;
CLOSE cur;
-- output results
OPEN curOut;
SET RESULT SETS CURSOR curOut;
END;
Я звоню с
call MYLIB.TEST_CONNECT_INSIDE_PROCEDURE()
Может кто-нибудь сказать мне, если это возможно, и уточнить, как это работает, пожалуйста? Если это невозможно в процедуре, есть ли обходной путь? Большое спасибо!