Oracle PLSQL函数抛出PL/SQL:数值或值错误:字符串缓冲区太小,无法返回大数据
我有以下PLSQL函数,在返回大数据时返回以下错误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
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