Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLSQL函数抛出PL/SQL:数值或值错误:字符串缓冲区太小,无法返回大数据_Sql_Oracle_Plsql - Fatal编程技术网

Oracle PLSQL函数抛出PL/SQL:数值或值错误:字符串缓冲区太小,无法返回大数据

Oracle PLSQL函数抛出PL/SQL:数值或值错误:字符串缓冲区太小,无法返回大数据,sql,oracle,plsql,Sql,Oracle,Plsql,我有以下PLSQL函数,在返回大数据时返回以下错误 ORA-06502: PL/SQL: numeric or value error: character string buffer too small 改进的PLSQL函数 我正在执行以下功能 SELECT CASE WHEN OPTIONS_TYPE = 'S' THEN OPTIONS_VALUES WHEN OPTIONS_TYPE

我有以下PLSQL函数,在返回大数据时返回以下错误

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 
改进的PLSQL函数

我正在执行以下功能

            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 GET CLOB


sql函数选项值的参数包含sql查询。

我怀疑您的逻辑过于复杂了一点。假设您实际上需要将查询动态地传递给函数,那么您可能只需要这样的东西

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>>

我怀疑你的逻辑有点过于复杂了。假设您实际上需要将查询动态地传递给函数,那么您可能只需要这样的东西

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>>
Per:

解码:

如果expr和search是字符数据,则Oracle使用 添加了比较语义。expr、search和result可以是 数据类型为CHAR、VARCHAR2、NCHAR或NVARCHAR2。字符串返回 是VARCHAR2数据类型,与第一个数据类型位于同一字符集中 结果参数

所以你们试图强迫解码的结果是clob,但事实并非如此

你试过解码而不是解码吗?我没有,但值得一试

Per:

解码:

如果expr和search是字符数据,则Oracle使用 添加了比较语义。expr、search和result可以是 数据类型为CHAR、VARCHAR2、NCHAR或NVARCHAR2。字符串返回 是VARCHAR2数据类型,与第一个数据类型位于同一字符集中 结果参数

所以你们试图强迫解码的结果是clob,但事实并非如此


你试过解码而不是解码吗?我没有,但值得一试

谢谢你的建议。我试过你的代码,它抛出ORA-06502:PL/SQL:numeric或value错误:原始变量长度太长ORA-06512:at FRDUSER.FRD_TELECOP_DYN_REP_SELECT_OPT,第20行。我有大约431行要连接。@SureshS-您要输入多少数据?显然,我对1000的选择有些武断。如果试图将1000多个字节放入变量,则需要使用更长的长度。如果您试图在变量中放入4000多字节,则需要使用LOB。我试图在V_OUT中放入大约90000字节的数据。是否需要使用DBMS_LOB函数写入V_OUT?@SureshS-如果您需要4000多字节,则需要使用CLOB。您可能希望使用一些DBMS_LOB方法将数据写入LOB。但是,如果您使用的是最新版本的Oracle,那么字符串函数和运算符都应该重载以支持CLOB。justin:您能指出一些链接吗,其中有一些关于如何读取LOB的示例。谢谢您的建议。我试过你的代码,它抛出ORA-06502:PL/SQL:numeric或value错误:原始变量长度太长ORA-06512:at FRDUSER.FRD_TELECOP_DYN_REP_SELECT_OPT,第20行。我有大约431行要连接。@SureshS-您要输入多少数据?显然,我对1000的选择有些武断。如果试图将1000多个字节放入变量,则需要使用更长的长度。如果您试图在变量中放入4000多字节,则需要使用LOB。我试图在V_OUT中放入大约90000字节的数据。是否需要使用DBMS_LOB函数写入V_OUT?@SureshS-如果您需要4000多字节,则需要使用CLOB。您可能希望使用一些DBMS_LOB方法将数据写入LOB。但是,如果您使用的是最新版本的Oracle,那么字符串函数和运算符都应该重载以支持CLOB。justin:您能指出一些链接吗,其中有一些关于如何读取LOB.OK的示例。您可以发布完整的错误堆栈,包括引发错误的行号吗?你能指出哪一行代码抛出了错误吗?您能告诉我们您使用的是什么版本的Oracle吗?@Justin:sql查询返回此错误ORA-22835:缓冲区太小,无法进行CLOB到CHAR或BLOB到RAW的转换实际值:34743,对于修改后的PLSQLOK,最大值:4000。您可以发布完整的错误堆栈,包括引发错误的行号吗?你能指出哪一行代码抛出了错误吗?您能告诉我们您使用的是什么版本的Oracle吗?@Justin:sql查询返回以下错误ORA-22835:缓冲区太小,无法进行CLOB到CHAR或BLOB到RAW的转换实际值:34743,最大值:4000对于修改后的PLSQLi尝试使用case语句,但它抛出ORA-00932:不一致数据类型:预期CHAR GET CLOBi试图使用case语句,但抛出ORA-00932:不一致数据类型:预期CHAR GET CLOB