在一个过程连接到2个数据库:一个本地和另一个远程

时间:2012-02-10 10:57:56

标签: sql stored-procedures db2 database-connection ibm-midrange

我正在尝试在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()

有人可以告诉我是否有可能并澄清它是如何运作的,拜托?如果在程序中不可能,是否有解决方法?非常感谢!

2 个答案:

答案 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 是关系数据库目录中的条目即可。