flyingnn
V2EX  ›  问与答

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

  •  
  •   flyingnn · Feb 3, 2016 · 3288 views
    This topic created in 3758 days ago, the information mentioned may be changed or developed.

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

    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 replies    2016-02-04 09:43:06 +08:00
    flyingnn
        1
    flyingnn  
    OP
       Feb 3, 2016
    对了,是 DB2 的 存储过程。
    ivvei
        2
    ivvei  
       Feb 3, 2016   ❤️ 1
    你能不能先把基础语法学习下…… Declare 一个游标后可以直接这么加语句? FOR 都不需要?
    flyingnn
        3
    flyingnn  
    OP
       Feb 3, 2016
    嗯,是删除了部份,漏掉了,
    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
       Feb 3, 2016
    @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  
       Feb 3, 2016   ❤️ 1
    @flyingnn begin 后面游标声明的前面 这段 不要有可执行语句。 DB2 特性如此,只能接受。
    flyingnn
        6
    flyingnn  
    OP
       Feb 4, 2016
    @ivvei 那像我这样的需求不可以实现吗?先 update ,再 select 返回。
    flyingnn
        7
    flyingnn  
    OP
       Feb 4, 2016
    @ivvei 明白了, update 放在后面也没有关系,放在 open 语句之前和之后,返回的结果都是一样的,都是 update 后的结果。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1580 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 16:42 · PVG 00:42 · LAX 09:42 · JFK 12:42
    ♥ Do have faith in what you're doing.