【问题标题】:How to modify the below oracle query to avoid ORA-06502 error?如何修改以下 oracle 查询以避免 ORA-06502 错误?
【发布时间】:2017-03-03 17:54:22
【问题描述】:

我有以下用户定义的表:

CREATE OR REPLACE TYPE number_ntt AS TABLE OF varchar2(500);

我还有以下功能:

CREATE OR REPLACE FUNCTION TO_STRINGS (
                    nt_in        IN number_ntt,
                  delimiter_in IN VARCHAR2 DEFAULT ','
                    ) RETURN VARCHAR2 IS
      v_idx PLS_INTEGER;
      v_str VARCHAR2(32767);
      v_dlm VARCHAR2(10);    
   BEGIN    
      v_idx := nt_in.FIRST;
      WHILE v_idx IS NOT NULL LOOP
         v_str := v_str || v_dlm || nt_in(v_idx);
         v_dlm := delimiter_in;
         v_idx := nt_in.NEXT(v_idx);
      END LOOP;    
      RETURN v_str;    
   END TO_STRINGS;
/
EXIT;

我有以下两张表:(附图

现在,我正在运行以下查询:

SELECT A.PERSONNUMBER,
(select TO_STRINGS
(CAST(COLLECT(C.LOCATIONNAME) as number_ntt)
) AS cnt 
from client.Tab_EMPLOYEES B JOIN client.Tab_Locations C ON B.MOBILELOCATIONID = C.MOBILELOCATIONID 
WHERE B.PERSONNUMBER = A.PERSONNUMBER)  as Assignedlocations
FROM client.Tab_EMPLOYEES A WHERE A.MOBILELOCATIONID = '100';

但我收到以下错误:

ORA-06502:PL/SQL:numeric or value error:string buffer too 小 ORA-06512:在第 1 行。

我认为我需要修改TO_STRINGS 函数或查询;任何帮助都将受到高度赞赏。

提前致谢。

【问题讨论】:

  • 拜托,not screenshots
  • Tab_Locations 中是否有 LOCATIONNAME 列?
  • 字符串拼接的结果是否有可能超出限制?另外,您似乎需要一种连接字符串的方法,您确定需要用户定义的函数吗?您能否发布一些示例数据和期望的结果?
  • 需要自己写函数吗?现代版本的 Oracle 有许多内置函数可以有效地聚合字符串。 See this SO thread

标签: sql oracle plsql


【解决方案1】:

基本上我在这里理解的是要求是基于人获取一组位置,即基于分隔符的聚合列表。这可以通过 LISTAGG 函数(如果 Oracle 版本等效或 > 11g)或 WM_CONCAT 来完成(注意这是来自 Oracle 的未记录函数)

CREATE TABLE AVR_1
  (SR NUMBER, A1 NUMBER_NTT
  )NESTED TABLE A1 STORE AS A1_TAB ;

INSERT INTO AVR_1 VALUES
  ( 1,NUMBER_NTT(1,5,2)
  );

INSERT INTO AVR_1 VALUES
  ( 2,NUMBER_NTT(7,6)
  );


    --Customized function to get output

    CREATE OR REPLACE
  FUNCTION TO_STR(
      P_IN in number,
      p_delimiter IN VARCHAR2 DEFAULT ',')
    RETURN VARCHAR2
  AS
    lv_out VARCHAR2(32676);
  BEGIN
    FOR I IN
    (SELECT a.SR,
      B.column_value val
    FROM AVR_1 a,
      table(a.A1) B
    WHERE a.SR = P_IN
    )
    LOOP
      LV_OUT:=LV_OUT||p_delimiter||I.VAL;
    end LOOP;
    RETURN substr(lv_out,2,length(lv_out));
  EXCEPTION
  WHEN OTHERS THEN
    RETURN ' ';
  END;


--For result

SELECT TO_STR(1,',') FROM DUAL;  

【讨论】:

  • 您是对的,但我们在不同的 Prod Box 中有 Oracle 10 和 11,因此 ListAgg 或 WM_Concat 将无法工作..需要一个适用于 Oracle 版本的解决方案。
  • 我已经根据要求稍微修改了代码。现在这必须在所有 Oracle 平台上工作。希望这会有所帮助。
  • 谢谢,但收到此错误:ORA-06553: PLS-306: wrong number or types of arguments in call to 'TO_STR'
  • 它工作正常。请检查传递给函数的参数。
猜你喜欢
  • 2015-06-11
  • 2019-10-01
  • 2020-03-10
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2019-01-02
相关资源
最近更新 更多