V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
flyingnn
V2EX  ›  问与答

如何写一个简单的 update 和 select 存储过程?

  •  
  •   flyingnn · 2016-02-03 17:10:48 +08:00 · 2437 次点击
    这是一个创建于 2976 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己写了一下,执行不成功:

    CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
    SPECIFIC DB2INST1.GETPEOPLE2
    DYNAMIC RESULT SETS 1
    MODIFIES SQL DATA
    LANGUAGE SQL

    BEGIN 
        update test2 set a=a+1 where a>ids;
        DECLARE rs1 CURSOR 
        select * from db2inst1.test2;
        OPEN rs1;
    

    END

    错误显示:

    SQL0104N 在 "ids; DECLARE" 之后发现意外的标记 "rs1 CURSOR sele"。期望的标记可能包括:"<psm_variable_name_list>"。 LINE NUMBER=10. SQLSTATE=42601

    感觉 DB2 写东西很难上手,郁闷中。。。

    7 条回复    2016-02-04 09:43:06 +08:00
    flyingnn
        1
    flyingnn  
    OP
       2016-02-03 17:11:27 +08:00
    对了,是 DB2 的 存储过程。
    ivvei
        2
    ivvei  
       2016-02-03 17:21:31 +08:00   ❤️ 1
    你能不能先把基础语法学习下…… Declare 一个游标后可以直接这么加语句? FOR 都不需要?
    flyingnn
        3
    flyingnn  
    OP
       2016-02-03 17:33:13 +08:00
    嗯,是删除了部份,漏掉了,
    CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
    SPECIFIC DB2INST1.GETPEOPLE2
    DYNAMIC RESULT SETS 1
    MODIFIES SQL DATA
    --READS SQL DATA
    LANGUAGE SQL

    BEGIN
    update test2 set a=a+1 where a>ids;
    DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR
    select * from db2inst1.test2;
    OPEN rs1;
    END

    当没有 update 这句,是可以成功 create 的,加了 update,就不行了。

    主要是用得少,没怎么去看文档。
    flyingnn
        4
    flyingnn  
    OP
       2016-02-03 17:54:16 +08:00
    @ivvei
    这个写没问题:
    CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
    SPECIFIC DB2INST1.GETPEOPLE2
    DYNAMIC RESULT SETS 1
    MODIFIES SQL DATA
    --READS SQL DATA
    LANGUAGE SQL

    BEGIN
    DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR select * from db2inst1.test2;
    update test2 set a=a+1 where a>ids;
    commit;
    OPEN rs1;
    END

    这样就不行了:

    CREATE PROCEDURE DB2INST1.GETPEOPLE2(IN ids bigint )
    SPECIFIC DB2INST1.GETPEOPLE2
    DYNAMIC RESULT SETS 1
    MODIFIES SQL DATA
    --READS SQL DATA
    LANGUAGE SQL

    BEGIN
    update test2 set a=a+1 where a>ids;
    DECLARE rs1 CURSOR WITH RETURN TO CLIENT FOR select * from db2inst1.test2;

    OPEN rs1;
    END

    提示:
    SQL0104N 在 "" 之后发现意外的标记 "<cursor declaration>"。期望的标记可能包括:"<SQL statement>"。 LINE NUMBER=10. SQLSTATE=42601
    ivvei
        5
    ivvei  
       2016-02-03 18:17:19 +08:00   ❤️ 1
    @flyingnn begin 后面游标声明的前面 这段 不要有可执行语句。 DB2 特性如此,只能接受。
    flyingnn
        6
    flyingnn  
    OP
       2016-02-04 09:28:19 +08:00
    @ivvei 那像我这样的需求不可以实现吗?先 update ,再 select 返回。
    flyingnn
        7
    flyingnn  
    OP
       2016-02-04 09:43:06 +08:00
    @ivvei 明白了, update 放在后面也没有关系,放在 open 语句之前和之后,返回的结果都是一样的,都是 update 后的结果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1732 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:39 · PVG 00:39 · LAX 09:39 · JFK 12:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.