Функция Oracle PLSQL выдает PL / SQL: ошибка с числовым значением или значением: буфер строки символов слишком мал для возврата больших данных - PullRequest
1 голос
/ 28 сентября 2011

У меня есть следующие функции PLSQL, которые возвращают следующую ошибку при возврате больших данных:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

ИЗМЕНЕННАЯ ФУНКЦИЯ PLSQL

 CREATE OR REPLACE FUNCTION FRDUSER.FRD_TELECOP_DYN_REP_SELECT_OPT (p_select IN VARCHAR2)
   RETURN CLOB
AS
 -- v_temp           CLOB;
  v_out            CLOB; 
  TYPE RefCurTyp   IS REF CURSOR;      
 -- len     BINARY_INTEGER;
  v_cursor         RefCurTyp; 
  c_key            VARCHAR2 (1000);
  c_value          VARCHAR2 (1000);
  separator        VARCHAR2(3);

BEGIN

    OPEN v_cursor FOR p_select;

    -- Fetch rows from result set one at a time:
    separator := '';     

    LOOP      

      FETCH v_cursor INTO c_key,c_value;        
        EXIT WHEN v_cursor%NOTFOUND;

   --      dbms_lob.createtemporary(v_out, TRUE);
  --       dbms_lob.open(v_out, dbms_lob.lob_readwrite);
         v_out := v_out ||  separator || c_key || ',' || c_value;  
  --       dbms_lob.append(v_out,  v_temp);
         separator := ':';  

    END LOOP;

    -- Close cursor:
    CLOSE v_cursor;
    RETURN (v_out);
END;
/

Я выполняюфункция, как показано ниже,

            SELECT   CASE  
                WHEN OPTIONS_TYPE = 'S' THEN    OPTIONS_VALUES
                WHEN OPTIONS_TYPE = 'D'  THEN TO_CLOB(FRD_TELECOP_DYN_REP_SELECT_OPT (OPTIONS_VALUES))  
                END  
      FROM FRD_REP_FW_REP_TEMPLATES A, FRD_REP_FW_TEMPLATES B
        WHERE A.REP_ID=1123 AND  A.TEMP_ID=B.TEMP_ID  
        ORDER BY A.REP_TEMP_ID ASC

Когда я запустил вышеуказанный sql-запрос, он выдаст следующую ошибку ORA-00932: несовместимые типы данных: ожидаемый CHAR получил CLOB

Параметр дляфункция sql (options_values) содержит запрос sql.

Ответы [ 2 ]

4 голосов
/ 28 сентября 2011

Я подозреваю, что вы немного усложняете свою логику. Возможно, вам просто нужно что-то вроде этого (при условии, что вам действительно нужно динамически передать запрос в функцию)

SQL> create table clob_test (
  2    key varchar2(100),
  3    val varchar2(100)
  4  );

Table created.

SQL> insert into clob_test
  2    select level, dbms_random.string( 'A', 100 )
  3      from dual
  4   connect by level <= 10000;

10000 rows created.

SQL> ed
Wrote file afiedt.buf

  1  create or replace function return_clob
  2    return clob
  3  as
  4    v_out clob;
  5    v_sql varchar2(1000) := 'select key, val from clob_test';
  6    v_key varchar2(100);
  7    v_val varchar2(100);
  8    v_rc  sys_refcursor;
  9  begin
 10    open v_rc for v_sql;
 11    loop
 12      fetch v_rc into v_key, v_val;
 13      exit when v_rc%notfound;
 14      v_out := v_out || v_key || ', ' || v_val;
 15    end loop;
 16    return v_out;
 17* end;
SQL> /

Function created.

SQL> select return_clob from dual;

RETURN_CLOB
--------------------------------------------------------------------------------

1, tzGWFXwKLgrRTGzTGbWMYMjVniIVMmCuGYGYydcrArHPRLExoFAJsZVhhPrRKyERExqRkbLGSebqX
<< more lob data removed>>
1 голос
/ 28 сентября 2011

за Oracle :

Decode:

Если expr и search являются символьными данными, Oracle сравнивает их, используя семантика сравнения без дополнения. expr, search и результат может быть любым из типы данных CHAR, VARCHAR2, NCHAR или NVARCHAR2 . Возвращенная строка имеет тип данных VARCHAR2 и находится в том же наборе символов, что и первый параметр результата.

Итак, вы пытаетесь заставить результат декодирования быть сгустком, чего не будет.

Вы пробовали оператор case вместо декодирования? (У меня нет, но стоит попробовать;)

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