我正在尝试在DB2 for AS400中编写一个存储过程,该存储过程在本地数据库上运行查询(与存储过程的位置相同;它的名称为DBLocale
),另一个在远程数据库上运行(我们称之为DBRemoto
)。在iSeries Navigator中,我可以看到它们都选择“数据库”节点。
我尝试使用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()
有人可以告诉我是否有可能并澄清它是如何运作的,拜托?如果在程序中不可能,是否有解决方法?非常感谢!
答案 0 :(得分:3)
在IBM i上,您需要包含远程数据库的用户和密码参数。
CONNECT TO DBRemoto USER QUAGMEIER USING 'GIGIDY'
密码必须是大写的,至少在嵌入式RPG中,它需要在主变量中。
答案 1 :(得分:0)
在IBM i 7.1下,Technical Refresh 4允许连接到多个数据库和3部分命名。这意味着表(或视图)引用可以采用 dbname.schema.table 的形式,只要 dbname 是关系数据库目录中的条目即可。