使用“ with data as”子句和正则表达式的更新不会提交。为什么?

时间:2019-05-30 16:43:59

标签: oracle plsql plsqldeveloper

提前谢谢!!我需要基于同一张表的字段在表内执行更新。Ex

table=>TGFCAB PK = 123;(NUMBER)
field1=> VARCHAR(1)  => TGFCAB.AD_STATUSLIB       => 'C','L','R' OR NULL
field2=> VARCHAR(100)=> TGFCAB.AD_FRETEAGLUTINADO => '124,125,431' (INT+COMMA+INT+COMMA...)

field2字符串中的每个数字都是表tgfcab另一个寄存器中的PK。

当更新field1时,我需要对在field2中找到的每个PK“输入”相同的值。

在此示例中,我在PK 123上将字段AD_STATUSLIB设置为“ L”。 PK 124、125和431也应更新为“ L”。

我正在使用“ with”子句从字符串中提取那些PK!

create or replace PROCEDURE "AD_LIBERA_FRETES_FILHOS"(
                                                    P_CODUSU NUMBER, 
                                                    P_IDSESSAO VARCHAR2, 
                                                    P_QTDLINHAS NUMBER, 
                                                    P_MENSAGEM OUT VARCHAR2) 
AS 

P_NUNOTA NUMBER(10);
P_CONTROLE VARCHAR(100);
P_PEDIDOS VARCHAR(100);
P_STATUS  VARCHAR(100);

BEGIN 
-- avoid more than 1 at a time
    IF (P_QTDLINHAS > 1) THEN 
        RAISE_APPLICATION_ERROR(-20000, 'SELECIONE APENAS UM PEDIDO PARA EXECUTAR ESTA AÇÃO.');

    END IF;


    FOR I IN 1..P_QTDLINHAS LOOP 
--extract param from session
        P_NUNOTA := ACT_INT_FIELD(P_IDSESSAO, I, 'NUNOTA');
        P_STATUS := ACT_TXT_FIELD(P_IDSESSAO, I, 'AD_LIBNFEXP');

--verify typed text should be "84090,89830,83393..."     
        BEGIN
            SELECT REGEXP_REPLACE(CAB.AD_FRETEAGLUTINADO, '[0-9-, ]', ''),
                    CAB.AD_FRETEAGLUTINADO 
            INTO    P_CONTROLE,
                    P_PEDIDOS
            FROM TGFCAB CAB
            WHERE CAB.NUNOTA = P_NUNOTA;

        END;

        IF (P_CONTROLE IS NOT NULL) THEN 

            RAISE_APPLICATION_ERROR(-20000, '<B>ATENÇÃO: HÁ DADOS INVÁLIDOS PARA FRETE AGLUTINADO!<BR> DIGITE APENAS NUNOTA SEPARADO POR VÍRGULA !</B>');

        ELSE 

--perform de update (not working)

BEGIN
                UPDATE TGFCAB C
                SET C.AD_LIBNFEXP = P_STATUS
                WHERE C.NUNOTA IN
                            (WITH DATA AS
                               (SELECT CAB.AD_FRETEAGLUTINADO STR
                                FROM TGFCAB CAB
                                WHERE CAB.NUNOTA = P_NUNOTA ) SELECT TRIM(REGEXP_SUBSTR(STR, '[^,]+', 1, LEVEL)) STR
                             FROM DATA CONNECT BY INSTR(STR, ',', 1, LEVEL - 1) > 0);

            END;


        END IF;

END LOOP;

--mgs to show
P_MENSAGEM := 'ACÃO EXECUTADA! VERIFIQUE OS PEDIDOS NRO. UNICO: '||P_PEDIDOS;

END;

程序可以编译并运行...但是没有任何更新!

0 个答案:

没有答案