【问题标题】:Replace String in Oracle Procedure在 Oracle 过程中替换字符串
【发布时间】:2010-10-07 04:46:52
【问题描述】:

我有一个关于 oracle 程序的问题,因为我是 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”,美元的下一个没有任何内容。预期结果是“BLA BLa Bla-USD-Bla Bla”

有什么想法吗?

【问题讨论】:

  • 你是说程序在第一次更新后退出循环?

标签: sql oracle stored-procedures plsql


【解决方案1】:

您编写循环的方式将多次更新您的一条记录,因此您无法确定最后应用哪个精确字符串。也许有一个值为“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';

它更简单,性能更高,而且是正确的。您可以将该语句嵌入到存储过程中,并根据您的要求进行参数化。

【讨论】:

  • 你说得对,我用 where no_akun = '4-1-200-2-03-0009';因为我只想检查一条记录,实际上我有数百条记录要替换。如果我找到正确的查询,我将更改 no_akun = '4-1-200-2-03-0009';到 no_akun = SATU.NO_AKUN;
【解决方案2】:

我相信@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 的当前值以及转换后的样子。

分享和享受。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2020-03-31
    • 1970-01-01
    • 2021-12-29
    • 2012-09-25
    • 2020-02-11
    • 2014-12-13
    相关资源
    最近更新 更多