Заменить строку в процедуре Oracle - PullRequest
2 голосов
/ 07 октября 2010

У меня проблема с оракулом, так как я новичок в языке sql: D, вот мой запрос

CREATE OR REPLACE PROCEDURE MONDESINT.UPDATECOADESCRIPTION IS

DESCRIPT MONDES_MSTR_CHART_OF_ACCOUNT.NAMA_AKUN%type;

BEGIN

    FOR SATU IN (select NO_AKUN, NAMA_AKUN 
                from mondes_mstr_chart_of_account 
                 where NO_AKUN LIKE '4-1-200-2-03-000%') 
    LOOP
        select REPLACE(NAMA_AKUN,SUBSTR(NAMA_AKUN,0,33),'Utang-Dana Deposit-USD') 
        INTO DESCRIPT 
        from mondes_mstr_chart_of_account 
        where NO_AKUN = '4-1-200-2-03-0009';

        update mondes_mstr_chart_of_account 
        set NAMA_AKUN = DESCRIPT 
        where NO_AKUN = '4-1-200-2-03-0009';
    END LOOP;

END UPDATECOADESCRIPTION;

В этом случае я бы заменил некоторую строку в столбце таблицы. Имя столбца «NAMA_AKUN», я бы заменил NAMA_AKUN, где NO_AKUN LIKE «4-1-200-2-03-000%». В приведенном выше коде я пробую для одной записи, что NO_AKUN = '4-1-200-2-03-0009'.

select REPLACE(NAMA_AKUN,SUBSTR(NAMA_AKUN,0,33),'Utang-Dana Deposit-USD') 
  from mondes_mstr_chart_of_account 
 where NO_AKUN = '4-1-200-2-03-0009';

... работает хорошо, он заменит "DOLLAR AMERICA" на "USD", т.е.: "BLA BLA Bla-DOLLAR AMERICA-Bla Bla" изменится на "BLA BLA Bla-USD-Bla Bla"

примечание: длина символа перед "DOLLAR" одинакова для всех записей.

Проблема в том ...

Когда я выполню эту процедуру, результатом будет: «BLA BLa Bla-USD» без каких-либо следующих USD. ожидаемый результат - "BLA BLa Bla-USD-Bla Bla"

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 07 октября 2010

То, как вы написали цикл, обновит вашу одну запись несколько раз, поэтому вы не можете быть уверены, какая именно строка применяется последней. Возможно, есть аккаунт со значением «BLA BLa Bla-DOLLAR AMERICA»?

Вам не нужен весь этот PL / SQL для этого. Достаточно одного оператора SQL:

    update mondes_mstr_chart_of_account 
    set NAMA_AKUN = replace(NAMA_AKUN, 'DOLLAR AMERICA', 'USD')  
    where NO_AKUN = '4-1-200-2-03-0009';

Это проще, более производительно и правильно. Вы можете встроить этот оператор в хранимую процедуру, параметризованную под ваши требования.

1 голос
/ 07 октября 2010

Я считаю, что @APC предоставил правильное решение. Вы можете проверить это без изменения данных, преобразовав инструкцию UPDATE в SELECT:

SELECT NAMA_AKUN, REPLACE(NAMA_AKUN, 'DOLLAR AMERICA', 'USD') AS NEW_NAMA_AKUN
  FROM MONDES_MSTR_CHART_OF_ACCOUNT
  WHERE INSTR(NAMA_AKUN, 'DOLLAR AMERICA') > 0;

Это покажет вам текущее значение NAMA_AKUN и как оно будет выглядеть после преобразования.

Делись и наслаждайся.

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