错误发生在客户端,而不是服务器端,所以这是sqlplus的特定版本的错误。当sqlplus 实用程序尝试将dbms_output 缓冲区从服务器端读取到客户端缓冲区时,会发生这种情况,并且该缓冲区包含一个长度超过 255 个字符的字符串。所以错误发生在:
- 您正在使用版本低于 10.2 的
sqlplus,并且数据库服务器的版本为 10.2 或更高版本。例如:
- 客户端是10.1.0.5,服务器是12.2.9
- 客户端是10.1.0.5,服务器是10.2.0.5
- 客户端是10.1.0.5,服务器是11.2.0.1
-
serveroutput on 选项已设置
- 您已将超过 255 个字符的行放入
dbms_output 缓冲区。
请注意,如果您的服务器是 10.1.0.5 或更低版本 (9.2.0.8),您会收到不同的错误:ORA-20000: ORU-10028: line length overflow, limit of 255 chars per line。
演示
输入 256 个字符,我们得到错误:
SET SERVEROUTPUT ON
begin
dbms_output.put_line(a => rpad('1',256,'1'));
end;
/
ERROR:
ORA-06502: PL/SQL: numeric or value error: host bind array too small
ORA-06512: at line 1
或者你可以用稍微不同的方式来做:
SET SERVEROUTPUT ON
begin
dbms_output.put(a => rpad('1',200,'1'));
dbms_output.put(a => rpad('1',200,'1'));
dbms_output.put_line('');
end;
/
ERROR:
ORA-06502: PL/SQL: numeric or value error: host bind array too small
ORA-06512: at line 1
输入 255 个字符,就可以得到输出了:
SET SERVEROUTPUT ON
begin
dbms_output.put_line(a => rpad('1',255,'1'));
end;
/
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111
如何解决
选项 1:
Oracle 在 10.2 版本中修复了该错误,因此如果您将服务器端和客户端组件升级到至少 10.2.0.5,该错误将得到修复。
选项 2:
如果您必须使用 10.1 或更早版本的 sqlplus(并且数据库版本为 10.2 或更高版本)并且您无法重写生成长字符串的 pl/sql 代码,那么您可以解决此错误使用dbms_output.get_lines(或dbms_output.get_line)程序:
SET SERVEROUTPUT OFF
begin
-- enable the server-side buffer. When SET SERVEROUTPUT ON sqlplus does it automatically.
-- Now we do it manually.
dbms_output.enable(1000000);
dbms_output.put_line(a => rpad('1',300,'1'));
end;
/
PL/SQL procedure successfully completed.
然后使用这个块来获取缓冲区的内容:
variable l_cursor REFCURSOR
set autoprint on
declare
-- Then use this block to get the contents of the buffer.
l number:=10000;
l_array DBMSOUTPUT_LINESARRAY;
begin
dbms_output.get_lines(l_array,l);
open :l_cursor for select * from table(l_array);
end;
/
PL/SQL procedure successfully completed.
COLUMN_VALUE
--------------------------------------------------------------------------------
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
11111111111111111111111111111111111111111111111111111111111111111111111111111111
111111111111111111111111111111111111111111111111111111111111