如何用PostgreSQL写存储过程(带游标版)

CREATE OR REPLACE PROCEDURE xxx_proc(

    Ps_xxxa   varchar,  -- 参数1
    Ps_xxxb   varchar   -- 参数2

) AS $body$
DECLARE

    /*变量声明*/
    Ws_xxxa  table.column%TYPE;    -- 参数类型和某表的某字段同类型
    Ws_xxxb  varchar(10);          -- 定义长度不超10的字符串类型

    rMain RECORD;                  -- 声明游标   < 方法四>

    Wn_CNT numeric(2);             -- 循环计数器  ループカウンタ<遍历>

    Ws_SQL  TEXT;                  -- SQLコマンド用

    /*方法一:加锁游标 LOCKカーソル*/
    CurLOCK_a CURSOR (
        Ps_xxxa   varchar  -- 参数1
    ) IS
        select from where ;
    FOR UPDATE;

    /*方法二:有参数游标FETCHカーソル*/
    CurFETCH_b  CURSOR(
        Ps_xxxa   varchar  -- 参数1
    ) IS
        select from where ;

    /*方法三:无参数游标FETCHカーソル*/
    CurFETCH_c  CURSOR FOR
        select from where ;

BEGIN

    /*根据需求完善代码*/
    select  into strict  from  where ;

    delete  from  where;

    update  set  where ;

    /*方法一:打开加锁游标LOCKカーソルをオープンする*/        
    OPEN  CurLOCK_a  (  Ws_xxxa  );
        
    /*方法二:打开有参数游标FETCHカーソルをループする*/
    FOR  rMain_a  IN  CurFETCH_b  (  Ws_xxxb  ) LOOP
        select into strict from where ;
    END LOOP;

    /*方法三:打开无参数游标FETCHカーソルをループする*/
    FOR rMain_b  IN  CurFETCH_c  LOOP
        update  set  where ;                
    END LOOP;

    /*方法四:循环结果集*/
    /*!!! 注意:要声明变量(具体实例在上面的注释 <方法四> )*/
    FOR rMain IN (
        select from where ;
    ) LOOP
        insert  into  values ;
        update set where ;
    END LOOP;

    /*<遍历>  !!! 注意:要声明该变量*/
    FOR Wn_CNT IN 1..50 LOOP
        -- 一般多用于动态sql或者数组(要更新表字段是id01~id50的那种情况)
        Ws_SQL := '';
        Ws_SQL := Ws_SQL || 'UPDATE ';
        Ws_SQL := Ws_SQL || '    table_name ';
        Ws_SQL := Ws_SQL || 'SET ';
        Ws_SQL := Ws_SQL || '    (  column ' ||  Wn_Cnt ||' ) ';
        Ws_SQL := Ws_SQL || '    = ';
        Ws_SQL := Ws_SQL || '    ( ';
        Ws_SQL := Ws_SQL || '        SELECT ';
        Ws_SQL := Ws_SQL || '            column '  ||  Wn_Cnt  ;
        Ws_SQL := Ws_SQL || '        FROM ';
        Ws_SQL := Ws_SQL || '            table_name ';
        Ws_SQL := Ws_SQL || '        WHERE ';
        Ws_SQL := Ws_SQL || '            1=1 ';
        Ws_SQL := Ws_SQL || '    ) ';
        Ws_SQL := Ws_SQL || 'WHERE ';
        Ws_SQL := Ws_SQL || '    1=1 ';

        EXECUTE Ws_SQL::varchar;

    END LOOP;

/*异常处理*/
EXCEPTION
    WHEN OTHERS THEN
        p_end_date  :=  TO_CHAR(clock_timestamp(),'YYYYMMDDHHMISS');
        p_ret_sts  :=  SQLSTATE;
        p_err_pos  :=  '9999';
        p_errm   :=  SQLERRM;
END;
$body$
LANGUAGE PLPGSQL;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值