Обновление с предложением «с данными как» и регулярное выражение не фиксируются. Зачем? - PullRequest
0 голосов
/ 30 мая 2019

Извините за задержку! Я взял рабочую нагрузку больше, чем я могу справиться с этими парами недель. Хорошо, давайте уточним! Существует запатентованное программное обеспечение, работающее поверх него и У меня нет возможности изменить это программное обеспечение! На самом деле это позволяет мне сделать несколько вещей. В этом конкретном случае я не могу создать отношение 1> N, я не могу создать новую таблицу! Я могу создавать поля. Итак, как мне настроить вещи? Через базу данных! Использование триггеров, функций и процедур. Я знаю, что это плохая «работа вокруг», но это то, что я получил и работает безупречно в 99% случаев. Любое исключение мой код выбрасывает, приложение показывает на экране!

Проблема в том, что обновление не работает.

Вы спрашиваете: Почему вы зацикливаетесь, когда вынуждены выполнять только одну итерацию (если P_QTDLINHAS может быть <1, я полагаю?) R: Couse пользователь может выбрать несколько строк в приложении, но я не хочу, чтобы они это делали. Так что выкидывает ошибку на экран. Почему вы вложили блоки начала / конца. R: Потому что мне, возможно, придется выбросить исключения, я привык писать начало Заявление Исключение какой-то конец сообщения. </p>

Пример данных: 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 );</p> <pre><code>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». Каждое число представляет PKNUMBER в той же таблице "SAMPLE_DATA".

Да, я знаю! пользователь может напечатать что-то неправильно .. давайте пока проигнорируем это!

Поле STATUS будет в конечном итоге обновлено на «C», «L», «R» ИЛИ NULL. Когда это происходит, мне нужно выполнить эту логику:

IF OLD.STATUS <> NEW.STATUS AND GROUPTOCHANGE IS NOT NULL THEN </p> <pre><code>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> <pre><code>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;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...