提前谢谢!!我需要基于同一张表的字段在表内执行更新。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;
程序可以编译并运行...但是没有任何更新!