【问题标题】:Syntax error when creating stored procedure in DB2在 DB2 中创建存储过程时出现语法错误
【发布时间】:2015-03-11 11:51:59
【问题描述】:

我正在尝试在 DB2 中创建一个使用游标的存储过程。但是,我遇到了正确语法的问题并收到错误消息:

    SQL0104N  An unexpected token "=" was found following "N FOR SET v_party_id".  
Expected tokens may include:  "JOIN".  LINE NUMBER=12.  SQLSTATE=42601

我的程序如下:

CREATE PROCEDURE Core.LWRH_LIST_CARRIER_EMAILS
(
    IN p_party_role_id BIGINT
)
LANGUAGE SQL
DYNAMIC RESULT SETS 1
BEGIN


DECLARE v_party_id BIGINT;
DECLARE c_result CURSOR WITH RETURN FOR
SET v_party_id = (Select party_id from core.party_role where party_role_id = p_party_role_id);

Select cm.contact_method_id, cm.contact_method_type_id, cm.electronic_address
from core.party_contact_method pcm
join core.contact_method cm
on cm.contact_method_id = pcm.contact_method_id
and cm.contact_method_type_id = 6
and pcm.party_id = v_party_id;



OPEN c_result;

END@

谁能建议正确的语法是什么?

谢谢

【问题讨论】:

    标签: sql stored-procedures cursor db2


    【解决方案1】:

    SET 语句位于 DECLARE CURSOR 语句的中间。它应该看起来像:

    ...
    
    DECLARE v_party_id BIGINT;
    
    -- This doesn't execute the statement, just declares the cursor.
    DECLARE c_result CURSOR WITH RETURN FOR
        select cm.contact_method_id, cm.contact_method_type_id, cm.electronic_address
        from   core.party_contact_method pcm
          join core.contact_method cm
            on cm.contact_method_id = pcm.contact_method_id
           and cm.contact_method_type_id = 6
           and pcm.party_id = v_party_id;
    
    
    SET v_party_id = (Select party_id from core.party_role where party_role_id = p_party_role_id);
    
    
    OPEN c_result;
    
    ...
    

    【讨论】:

    • 对对对,我还以为是声明游标的时候就执行了语句。这就是为什么我首先执行 set 语句的原因,因为我认为变量值在查询中使用时还没有设置。谢谢!
    【解决方案2】:

    至少有一个问题是您没有在set 语句上定义游标。您在 select 语句中定义它。所以,这句话:

    DECLARE c_result CURSOR WITH RETURN FOR
    SET v_party_id = (Select party_id from core.party_role where party_role_id = p_party_role_id);
    

    没有意义。

    试试这个:

    DECLARE c_result CURSOR WITH RETURN FOR
        Select party_id
        from core.party_role
        where party_role_id = p_party_role_id;
    

    或者,如果只有一行,则省略光标。

    【讨论】:

    • 我之前曾尝试将光标声明移动到您建议的位置,然后我收到错误:在“”之后发现了意外的标记“”。预期的标记可能包括:“
    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 2010-10-12
    • 2019-02-02
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多