ORA-22905: 无法访问非嵌套表项中的行。替换多个字符

问题描述 投票:0回答:1

下面的代码抛出错误。请帮忙。

ORA-22905: 无法访问非嵌套表项中的行 22905. 00000 - “无法访问非嵌套表项中的行” *原因:尝试访问类型未知的项目的行 解析时间或者不是嵌套表类型 *操作:使用CAST来投射它

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

CREATE OR REPLACE FUNCTION custom.FN_REPLACETEXT(
    pText IN VARCHAR2, 
    pPar IN custom.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;
/

select * from custom.FN_REPLACETEXT('Hello {0}, this is a {2} for {1}', custom.TBL_VARCHAR2('world','all','message'));

例如:您好 {0},这是 {2} 的 {1} 我想将 {0} 替换为 FRINEDS,将 {1} 替换为 SAMPLE,将 {2} 替换为 DYNAMIC_STRING

oracle plsql replace regexp-replace
1个回答
0
投票

返回标量数据类型的函数应在

SELECT
子句中调用,而不是在
FROM
子句中。例如:

select FN_REPLACETEXT('Hello {0}, this is a {2} for {1}', TBL_VARCHAR2('world','all','message'))
from dual;
© www.soinside.com 2019 - 2024. All rights reserved.