我正在使用游标连接字符串(以形成稍后执行的查询(。在这里,将形成的查询将比VARCHAR2(32767(所能处理的查询大得多。因此,我在进程执行中遇到错误-ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。
我也使用了CLOB数据类型,但得到了错误ORA-06502:PL/SQL:numeric或value错误。
我的代码在下面:
CREATE OR REPLACE PROCEDURE sp_Market
IS
Names VARCHAR2(32767);
BEGIN
DECLARE CURSOR cur IS ('Select ID, Order_of, field_name
FROM pld_medicare_config');
BEGIN
FOR i IN cur
LOOP
Names := Names || i.sqql;
END LOOP;
dbms_output.put_line(Names);
END;
END sp_Market;
我如何处理我的字符串查询,有什么数据类型可以完成任务?
CLOB
正常(据我所知(;我怀疑您存储的查询是否有大的。
从过程中删除dbms_output.put_line
调用;我怀疑是它引起了这个错误。
我不确定您是如何得到任何运行时错误的,因为您的过程不会编译。
有效的PL/SQL版本如下所示:
create or replace procedure sp_market is
names varchar2(32767);
begin
for r in (
select id, order_of, field_name
from pld_medicare_config
)
loop
names := names || ' ' || r.field_name;
end loop;
names := ltrim(names);
dbms_output.put_line(names);
end sp_market;
如果names
需要更长,请将数据类型更改为clob
。
使用CLOB
数据类型并使用dbms_lob.writeappend
过程附加数据。这是参考(Oracle 18c(。
错误可能源于dbms_output.put_line
调用。该过程仅为varchar2
参数定义,这意味着在调用过程中会发生隐式转换。对于长度超过32767个字符/字节的clob内容,它将失败。
或者,您可以在varchar2(4000)
上声明集合,并按顺序填充集合元素:
CREATE OR REPLACE PROCEDURE sp_Market
IS
TYPE tLongString IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
cNames tLongString;
BEGIN
DECLARE CURSOR cur IS Select ID, Order_of, field_name, sqql FROM pld_medicare_config;
BEGIN
FOR i IN cur
LOOP
cNames(cNames.COUNT+1) := i.sqql;
END LOOP;
END;
END sp_Market;
注意
已更正代码,现在将编译。