DB2、PL/SQL 和游标(IBM 不遵循自己的帮助页面)



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}明确表示方言。

相关内容

最新更新