如何从DB2中的存储过程中获取变量值?

时间:2010-03-22 18:12:06

标签: db2

这看起来应该很容易......无论如何,它在MS SQL Server中

在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的值。打印不起作用,选择不起作用。有人说我必须先将它插入表中,然后在运行存储过程后获取它。这真的有必要吗?

谢谢, 西尔维亚

编辑:我应该更清楚一点,我想在设置之后每次都看到Stmt的值,我可能需要在同一个存储过程中多次设置它。

4 个答案:

答案 0 :(得分: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来实现此目的,如果您愿意的话。

答案 1 :(得分: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

答案 2 :(得分:1)

请尝试以下行:

values Stmt;

答案 3 :(得分:1)

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

使用log4db2,您无需删除可能在将来使用的调试消息。您只需停用关联记录器或降低日志记录级别,就像使用'log4j'

一样

https://github.com/angoca/log4db2

检查该实用程序