如何在DB2中从存储过程内部获取变量值?
这看起来应该很容易…无论如何,这是在MS SQL Server中 在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
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方法。这里似乎有完整的说明: