【问题标题】:DB2 error in using the cursor in PL/SQL function在 PL/SQL 函数中使用游标时出现 DB2 错误
【发布时间】:2012-09-28 08:12:21
【问题描述】:

我在 DB2 PL/SQL 函数中声明一个游标如下:

create function query1(tbname VARCHAR(32), msisdn VARCHAR(32)) 
returns VARCHAR(40) 
LANGUAGE SQL 
READS SQL DATA 
NO EXTERNAL ACTION 
DETERMINISTIC 
begin atomic 
    DECLARE vsql varchar(2000); 
    DECLARE dt_UTC   date; 
    DECLARE C1 CURSOR FOR select productid from Subscription_000 where msisdn= 123456; 
    SET vsql = 'select productid from Subscription_000 where msisdn= 123456'; 
OPEN C1; 


    return '123'; 
end 
@ 

我将以上内容保存到 k2.sql 和 当我尝试使用以下命令编译此函数时:db2 -td@ -f k2.sql 我收到以下错误:

DB21034E 该命令被作为 SQL 语句处理,因为它是 不是有效的命令行处理器命令。在 SQL 处理期间 返回:SQL0104N 在以下发现意外的标记“FOR” “声明 C1 光标”。预期的令牌可能包括: “”。行号=10。 SQLSTATE=42601

关于这里有什么问题......有什么建议吗?

【问题讨论】:

    标签: cursor db2


    【解决方案1】:

    这是一个棘手的问题,但经过一些测试,我发现了问题:您不能在原子复合语句中声明游标。将 BEGIN ATOMIC 替换为 BEGIN

    我希望我能指出ATOMIC 的允许语句列表,但它隐藏在手册中的某个地方,我现在找不到。

    (这是 DB2 可怕的错误报告的经典案例。它不应该能够识别不允许的语句并告诉你吗?)

    编辑:这是问题之一,但还有一些其他问题,我没有,所以我无法调试它。

    【讨论】:

    • 我只用 BEGIN 替换了 BEGIN ATOMIC,但现在我得到不同的错误:DB21034E 该命令被作为 SQL 语句处理,因为它不是有效的命令行处理器命令。在 SQL 处理期间,它返回: SQL0104N 在“CTION DETERMINISTIC”之后发现了意外的标记“开始”。预期的标记可能包括:“”。第 7 行。 SQLSTATE=42601
    • 当我通过 SQL 编辑器发送函数时,它编译得很好。从命令行运行它听起来像是一个额外的问题。抱歉,我无法提供帮助,因为我无法访问该工具(或者,我想这可能是版本问题。我使用的是 DB2 LUW 9.7)。
    • @Sekhar,根据我在手册中的信息,您可能无法使用您的版本中的功能来执行此操作。根据你想如何使用它,你可能想把它写成一个过程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多