2010-03-22 94 views
2

这似乎应该很容易...无论如何,它是在MS SQL服务器如何从DB2中的存储过程中获取变量值?

在DB2存储过程中,我怎么才能得到一个变量的值?假设我有以下存储过程:

CREATE PROCEDURE etl.TestABC( 
) 
LANGUAGE SQL 
    BEGIN 
    declare  Stmt    varchar(2048); 
    set Stmt = 'this is a test'; 
-- print Stmt; 
-- select Stmt; 


    return 0; 
END @ 

我想在设置它后打印出Stmt的值。打印不起作用,选择不起作用。有人说我必须先将它插入到表中,然后在运行存储过程之后再获取它。这真的有必要吗?

感谢, 西尔维亚

编辑:我应该更加明确,我希望看到语句的值以后每次我设置它,我可能需要在同一个存储过程中多次设置。

回答

6

如果你想看到的值当你正在开发/测试你的存储过程,那么你应该使用IBM Data Studio和调试您的存储过程。这提供了正常的调试器功能,因此您可以在您的过程执行时看到变量的值。

但是,如果你只是想执行存储过程,并看到值的历史,我建议创建一个全局临时表,并插入一行到它在你的代码:

declare global temporary table StmtHistory (
    when timestamp not null with default current timestamp, 
    stmt varchar(2048) not null 
) on commit preserve rows; 

然后,在存储过程中的点,添加:

insert into session.StmtHistory (stmt) values (stmt); 

你执行存储过程后,就可以查询该表session.StmtHistory,看到你正在寻找的价值。

此外,DB2 9.7增加了Oracle兼容性,所以如果您使用的是此版本,您可能实际上可以使用DBMS_OUTPUT.PUT_LINE和DBMS_OUTPUT.GET_LINES来完成此操作,如果您愿意的话。

+0

谢谢伊恩。我们一直在写临时表来获取值,但会尝试DBMS_OUTPUT.PUT_LINE方法。 这里似乎有完整的说明:http://www.ibm.com/developerworks/data/library/techarticle/0302izuha/0302izuha.html#download – Sylvia 2010-03-24 15:46:30

3

您必须声明的变量在程序的构造函数:

CREATE PROCEDURE etl.TestABC(
    OUT Stmt varchar(2048) 
) 
LANGUAGE SQL 
BEGIN 
    -- declare  Stmt    varchar(2048); 
    set Stmt = 'this is a test'; 
    -- print Stmt; 
    -- select Stmt; 

    return 0; 
END @ 

这将让你即从控制台访问:

call etl.TestABC(?) 

用,因为这类似的输出:

Value of output parameters 

Parameter Name : STMT 
Parameter Value : this is a test 

Return Status = 0 

注意:我目前无法访问我们的DB2服务器,但我相信上述内容应该有所裨益。基于实例: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.apdv.sql.doc/doc/t0007055.htm

+0

感谢您的反馈意见。如果我要在存储过程的多个点修改变量,并且想要在每个点输出值,该怎么办?看起来上面只是输出变量的最后一个值,如果我正确地读取它的话...... – Sylvia 2010-03-22 19:31:00

+0

正确,这会在程序结束运行后为变量的最终状态留下一个变量。恐怕我不知道如何使用多个OUT变量获得(1)以外的临时值; (2)将你的单个程序分成多个程序(每个程序会给你自己的最终值);或(3)将临时结果存储在某个表中。我个人认为,除了将它们设置为OUT变量外,您不能以PL/SQL本机方式公开过程的内部变量。更有经验的人:请告知是否有更好的方法,我也会对此感兴趣。谢谢! – MicE 2010-03-22 20:11:47

1

尝试以下行:

values Stmt; 
+0

我收到以下“ SQL0104N意外标记”值(Stmt); 值Stmt“被发现在” – Sylvia 2010-03-22 19:27:49

+0

“之后,看起来像别的东西在那里很时髦。 'values(Stmt)'从哪里来?你也可以尝试类似'select * from(values'34')foo' – 2010-03-23 12:54:22

1

您可以使用允许您在表或文件中写入消息的“log4db2”之类的日志记录系统。这些消息由可以处于活动状态或不活动状态的记录器控制。

使用log4db2,您不需要删除将来可能使用的调试消息。你只要停用关联记录,或降低日志记录级别,完全按照你“的log4j”

检查工具在做:https://github.com/angoca/log4db2

相关问题