如何在DB2中从存储过程内部获取变量值?

如何在DB2中从存储过程内部获取变量值?,db2,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

这看起来应该很容易…无论如何,这是在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 @ 
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 @ 
我想在设置Stmt后打印出它的值。打印无效,选择无效。有人说我必须先将它插入到表中,然后在运行存储过程后获取它。这真的有必要吗

谢谢, 西尔维亚


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

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

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


    return 0; 
END @ 
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服务器的权限,但我相信上面提到的应该可以解决这个问题。示例基于:

试试下面这句话:

values Stmt;

如果希望在开发/测试存储过程时看到这些值,那么应该使用IBMDataStudio并调试存储过程。这提供了正常的调试器功能,因此您可以在过程执行时查看变量的值

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

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_LINE来实现这一点,如果您愿意的话。

您可以使用类似“log4db2”的日志系统,允许您在表或文件中写入消息。这些消息由记录器控制,记录器可以是活动的,也可以是非活动的

使用log4db2,您不需要删除将来可能使用的调试消息。您只需停用关联记录器,或降低日志记录级别,就像使用“log4j”一样


检查以下位置的实用程序:

I获取以下“SQL0104N意外令牌”值(Stmt);值Stmt“被发现在下面”它看起来像其他东西是时髦的。
值(Stmt)
来自哪里?您也可以尝试类似的
select*from(values'34')foo
感谢您的反馈。如果要在存储过程中的多个点修改变量,并希望在每个点输出值,该怎么办?如果我读对了,上面的代码似乎只会输出变量的最后一个值……正确,这将在过程运行结束后留给您变量的最终状态。恐怕我不知道如何获得中间值,除了(1)使用多个OUT变量;(2) 将您的单个过程拆分为多个过程(每个过程都会给您自己的最终值);或者(3)将临时结果存储在某个表中。我(个人)认为,除了将过程的内部变量设置为OUT变量之外,不能在PL/SQL中本机公开它们。更有经验的人:如果有更好的方法,请告诉我,我也会感兴趣的。谢谢!谢谢你,伊恩。我们一直在写入临时表以获取值,但将尝试DBMS_OUTPUT.PUT_LINE方法。这里似乎有完整的说明: