2012-02-10 23 views
3

我想写一个存储过程,在AS400的DB2,它在本地数据库上运行查询(存储过程相同;它是命名为DBLocale),另一个在远程数据库(我们称之为DBRemoto)。在iSeries Navigator中,我可以看到他们都选择“数据库”节点。我尝试了一些CONNECT TO DBRemoto;和/或SET CONNECTION DBRemoto;,但得到了奇怪的结果:“连接已经存在”,“连接不存在”,“CALL指令完成”(但没有结果集)等。在一个过程连接到2个数据库:一个本地和另一个远程

这将是我所期望的事情:

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() 

谁能告诉我,如果有可能,并说明它是如何工作的,好吗?如果在程序中不可行,是否有解决方法?非常感谢!

回答

3

在IBM i上,您需要包含远程数据库的用户和密码参数。

CONNECT TO DBRemoto USER QUAGMEIER USING 'GIGIDY' 

密码需要在上壳体和至少在嵌入RPG它需要在宿主变量。

+1

Bob Cozzi和家庭人参考。真棒。 – jamesallman 2012-02-10 17:27:07

+0

谢谢!你确定密码需要引号吗?无论如何,它在任何情况下都不起作用:它不会创建过程并给我一个SQL7032错误。 – bluish 2012-02-13 13:16:20

0

在IBM i 7.1中,技术刷新4允许连接到多个数据库和三部分命名。这意味着只要dbname是关系数据库目录中的条目,表(或视图)引用就可以采用dbname.schema.table的形式。

相关问题