首页 > 解决方案 > 使用“with data as”子句进行更新,并且不提交正则表达式。为什么?

问题描述

抱歉耽搁了!我承受的工作量比我能应付这几周的还要大。好的,让我们澄清一下!有一个专有软件在它上面运行,我没有能力改变这个软件!实际上它允许我做一些事情。在这种特定情况下,我无法创建关系 1>N,我无法创建新表!我能做的是创建字段。那么,我该如何定制东西呢?通过数据库!使用触发器、函数和过程。我知道这是一个糟糕的“解决方法”,但这是我得到的,并且 99% 的时间都完美无缺。任何异常我的代码都会引发应用程序显示在屏幕上!

问题实际上是更新不起作用。

你问:为什么你在强制只有一次迭代时循环(除非我想 P_QTLINHAS 可以 < 1?) R:因为用户可以在应用程序中选择多行但我不希望他们这样做. 所以在屏幕上抛出一个错误。为什么你有嵌套的开始/结束块。R:因为我可能不得不抛出异常,我习惯于写 begin Statements Exception 一些消息结束。

样本数据: CREATE TABLE SAMPLE_DATA ( PKNUMBER NUMBER NOT NULL , DESCRIPTION VARCHAR2(20) , GROUPTOCHANGE VARCHAR2(100) , STATUS VARCHAR2(1 BYTE) , CONSTRAINT SAMPLE_DATA_PK PRIMARY KEY ( PKNUMBER ) ENABLE );

INSERT INTO sample_data  VALUES (1000,'ORDER1',NULL,NULL);
INSERT INTO sample_data  VALUES (2000,'ORDER2',NULL,NULL);
INSERT INTO sample_data  VALUES (3000,'ORDER3',NULL,NULL);
INSERT INTO sample_data  VALUES (4000,'ORDER4','1000,2000,30001',NULL);

在这种情况下,字段 GROUPTOCHANGE 将由用户填写,如“2108,8090,8843”。每个数字代表同一个表“SAMPLE_DATA”中的一个 PKNUMBER。

是的,我知道!用户可以输入错误的内容.. 让我们暂时忽略它!

字段 STATUS 最终将更新为“C”、“L”、“R”或 NULL。发生这种情况时,我需要执行此逻辑:

IF OLD.STATUS <> NEW.STATUS AND GROUPTOCHANGE IS NOT NULL THEN

UPDATE SAMPLE_DATA SP 
SET SP.STATUS = :NEW.STATUS 
WHERE SP.PKNUMBER IN (:NEW.GROUPTOCHAGE) 
AND PS.GROUPTOCHANGE IS NULL;

END IF;

尽管糟糕的设计有可能吗?感谢您的帮助!

这是我到目前为止所做的: 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, 'PKNUMBER');
        P_STATUS := ACT_TXT_FIELD(P_IDSESSAO, I, 'STATUS');

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

        END;

        IF (P_CONTROLE IS NOT NULL) THEN 

            RAISE_APPLICATION_ERROR(-20000, '<B> SOMETHING WRONG !</B>');

        ELSE 

--perform de update (not working)

BEGIN
                UPDATE SAMPLE_DATA C
                SET C.STATUS = P_STATUS
                WHERE 
                C.GROUPTOCHANGE IS NULL AND
                C.PKNUMBER IN
                            (WITH DATA AS
                               (SELECT CAB.GROUPTOCHANGE STR
                                FROM SAMPLE_DATA CAB
                                WHERE CAB.PKNUMBER = 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 := 'DONE!! CHECK -> '||P_PEDIDOS;

END;

标签: oracleplsqlplsqldeveloper

解决方案


推荐阅读