Извините за задержку! Я взял рабочую нагрузку больше, чем я могу справиться с этими парами недель.
Хорошо, давайте уточним!
Существует запатентованное программное обеспечение, работающее поверх него и
У меня нет возможности изменить это программное обеспечение! На самом деле это позволяет мне сделать несколько вещей.
В этом конкретном случае я не могу создать отношение 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;