db2,版本10.5。
我的光标是这样的:
declare stat cursor for select record_type, sequence_code from my_status fetch first 10 rows only;
任何尝试使用IBM网页上记录的for结构进行遍历的尝试,例如
for s in stat do
call dbms_output.put_line ('In the cursor loop');
end for;
db21034e该命令是作为SQL语句处理的,因为它不是有效的命令行处理器命令。在SQL处理过程中,它返回:SQL0104N在rst 10 rows only;
之后发现了一个意外的令牌" for"。期望的令牌可能包括:"。线号= 9。sqlstate = 42601。
所以我尝试在循环中进行明确的打开和提取,但它会永远继续下去(即,如果我曾经't将循环中的显式计数器放入。显示数据中的字段证明它正在循环1、2、3 .. 9、10、10、10、10、10。
所以我尝试添加 "如果找到了Stat%"在循环中并遇到此错误:
db21034e该命令是作为SQL语句处理的,因为它不是有效的命令行处理器命令。在SQL处理过程中,它返回:SQL0104N在" ence_code; if stat"之后发现了一个意外的令牌"%"。预期的令牌可能包括:"是"。行号= 24。sqlstate = 42601
我什至尝试了一个案例语句检查发现/未发现状态并有类似的错误:
case when stat%NOTFOUND then
call dbms_output.put_line('In case');
end case;
db21034e该命令是作为SQL语句处理的,因为它不是有效的命令行处理器命令。在SQL处理过程中,它返回:SQL0104N在"统计数据"时发现了一个意外的令牌"%"。预期的令牌可能包括:" in"。行号= 30。sqlstate = 42601
将其更改为stat.%NOTFOUND
(在%之前的一个时期(让我感到:
db21034e该命令是作为SQL语句处理的,因为它不是有效的命令行处理器命令。在SQL处理过程中,它返回:SQL0104N在"案件"之后发现了一个意外的令牌" stat。%notfound"当"。预期令牌可能包括:"。数字= 30。sqlstate = 42601
我尝试了" exit when stat%NOTFOUND
",它是IBM支持页面上逐字化的。这给我带来了类似的错误:
db21034e该命令是作为SQL语句处理的,因为它不是有效的命令行处理器命令。在SQL处理过程中,它返回:SQL0104N在""之后发现了一个意外的令牌"退出"。预期的令牌可能包括:"。行号= 23。sqlstate = 42601
各种位置的全部代码的整个块评论效果很好,除了无法终止数据终止:
set serveroutput on@
begin
declare v_counter int default 0;
declare v_record_type char(1);
declare v_sequence_code int;
declare stat cursor for select record_type, sequence_code from my_status fetch first 10 rows only;
-- for s in stat do
-- call dbms_output.put_line ('In the cursor loop');
-- end for;
open stat;
fetch from stat into v_record_type, v_Sequence_code;
set v_counter = 0;
while v_counter < 12 do
call dbms_output.put_line('in loop');
call dbms_output.put_line('Record: '||v_record_type||' '||v_sequence_code);
set v_counter = v_counter + 1;
call dbms_output.put_line ('Counter: '||v_counter);
fetch from stat into v_record_type, v_sequence_code;
--if stat%FOUND then
-- call dbms_output.put_line ('Yay, found!');
--end if;
--if stat%NOTFOUND then
-- exit;
--end if;
--case when stat%NOTFOUND then
-- call dbms_output.put_line('In case');
--end case;
--EXIT WHEN stat%NOTFOUND;
end while;
close stat;
END -- end procedure
@
set serveroutput off@
db2用于LUW支持两种不同的PSM方言:本机DB2 SQL PL和与Oracle兼容PL/SQL
由于SQL PL一直存在,因此在文档中的常规SQL参考中涵盖了其陈述。PL/SQL支持在2010年左右添加,其语法在单独的部分(上面链接(中描述。您需要注意不要混合两者,因为程序块只能使用两个方言中的任何一个,但都不能在同一块中使用。许多陈述中存在某些句法差异,因此,一旦选择了要使用的方言,就应该注意手册中的适当部分。
语法检测基于结构或多或少是自动的。在db2 sql pl中, DECLARE
语句出现在块内,而在pl/sql中它们在块之外。因此,如果您的块以
BEGIN
DECLARE something;
...
END
假定它包含SQL PL语句,并且如果编译器遇到PL/SQL语句,则会引发语法错误。
使用DB2命令行处理器运行程序时,您可以使用命令SET SQLCOMPAT {DB2|PLSQL}
明确表示方言。