Multiple REPLACE function in Oracle

后端 未结 6 1799
陌清茗
陌清茗 2020-12-05 07:25

I am using the REPLACE function in oracle to replace values in my string like;

 SELECT REPLACE(\'THE NEW VALUE IS #VAL1#\',\'#VAL1#\',\'55\') fr         


        
6条回答
  •  猫巷女王i
    2020-12-05 07:44

    I have created a general multi replace string Oracle function by a table of varchar2 as parameter. The varchar will be replaced for the position rownum value of table.

    For example:

    Text: Hello {0}, this is a {2} for {1}
    Parameters: TABLE('world','all','message')
    

    Returns:

    Hello world, this is a message for all.
    

    You must create a type:

    CREATE OR REPLACE TYPE "TBL_VARCHAR2" IS TABLE OF VARCHAR2(250);
    

    The funcion is:

    CREATE OR REPLACE FUNCTION FN_REPLACETEXT(
        pText IN VARCHAR2, 
        pPar IN TBL_VARCHAR2
    ) RETURN VARCHAR2
    IS
        vText VARCHAR2(32767);
        vPos INT;
        vValue VARCHAR2(250);
    
        CURSOR cuParameter(POS INT) IS
        SELECT VAL
            FROM
                (
                SELECT VAL, ROWNUM AS RN 
                FROM (
                      SELECT COLUMN_VALUE VAL
                      FROM TABLE(pPar)
                      )
                )
            WHERE RN=POS+1;
    BEGIN
        vText := pText;
        FOR i IN 1..REGEXP_COUNT(pText, '[{][0-9]+[}]') LOOP
            vPos := TO_NUMBER(SUBSTR(REGEXP_SUBSTR(pText, '[{][0-9]+[}]',1,i),2, LENGTH(REGEXP_SUBSTR(pText, '[{][0-9]+[}]',1,i)) - 2));
    
            OPEN cuParameter(vPos);
            FETCH cuParameter INTO vValue;
            IF cuParameter%FOUND THEN
                vText := REPLACE(vText, REGEXP_SUBSTR(pText, '[{][0-9]+[}]',1,i), vValue);
            END IF;
            CLOSE cuParameter;
        END LOOP;
    
        RETURN vText;
    
    EXCEPTION
          WHEN OTHERS
          THEN
             RETURN pText;
    END FN_REPLACETEXT;
    /
    

    Usage:

    TEXT_RETURNED := FN_REPLACETEXT('Hello {0}, this is a {2} for {1}', TBL_VARCHAR2('world','all','message'));
    

提交回复
热议问题