to:jiezhi(西域浪子) 当 Output from Stored Procedures and Triggers 时 出现 ORU-10027: buffer overflow ORU-10028: line length overflow
to:greatplain(蓝屏) 那我说的问题你能解决先? 着急上火,没时间深入研究啦!
CREATE OR REPLACE FUNCTION EDU.test_varchar2( str in varchar2) RETURN varchar2 IS str2 varchar2(3000); lg number; BEGIN lg := length(str); str2 := 'fasfdsfafsdfasfsdfsadsfafs' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ; RETURN (str2); END; /
呵呵,这个问题就没人解决吗? 传说中oracle达人快快现身啊!!
8.1.7没有问题 SQL> CREATE OR REPLACE FUNCTION test_varchar2( 2 str in varchar2) 3 RETURN varchar2 IS 4 str2 varchar2(3000); 5 lg number; 6 BEGIN 7 lg := length(str); 8 str2 := 'fasfdsfafsdfasfsdfsadsfafs' 9 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 10 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 11 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 12 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 13 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 14 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 15 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 16 ; 17 RETURN (str2); 18 END; 19 /函数已创建。
to: yhdlong(东东) 请把上面的FUNCTION 在8.1.7 for linux 中执行一下, 不出 ORU-10028: line length overflow 的错误?
SQL> CREATE OR REPLACE FUNCTION test_varchar2( 2 str in varchar2) 3 RETURN varchar2 IS 4 str2 varchar2(3000); 5 lg number; 6 BEGIN 7 lg := length(str); 8 str2 := 'fasfdsfafsdfasfsdfsadsfafs' 9 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 10 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 11 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 12 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 13 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 14 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 15 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' 16 ; 17 RETURN (str2); 18 END; 19 /函数已创建。 SQL> declare 2 str varchar2(4000); 3 begin 4 str := test_varchar2('plain'); 5 end; 6 /PL/SQL 过程已成功完成。SQL> 只是我的oracle是临时装的,有点问题 不能使用dbms_output包,看不到执行结果 成功执行却是没有任何问题的
to:greatplain(蓝屏) 如果你现在用另外一个存储过程或者函数调用 test_varchar2( str in varchar2)就会发现错误啦
SET SERVEROUTPUT ON SIZE 1000000 declare str varchar2(4000); begin str := test_varchar2('plain'); --dbms_output.put_line(str); end; / PL/SQL 过程已成功完成。 SET SERVEROUTPUT ON SIZE 1000000 declare str varchar2(4000); begin str := test_varchar2('plain'); dbms_output.put_line(str); end; / declare * ERROR 位于第1行: ORA-06502: PL/SQL: 数字或值错误 ORA-06512: 在"SYS.DBMS_OUTPUT", line 57 ORA-06512: 在line 5 ??????????? 郁闷中........
SQL> ed 已写入文件 afiedt.buf 1 declare 2 str varchar2(800); 3 begin 4 str := test_yl1('plain'); 5 dbms_output.put_line(substrb(str,1,255)); 6* end; SQL> / plainfasfdsfafsdfasfsdfsadsfafssdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafass afsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsaf sdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsPL/SQL 过程已成功完成。 SQL> ed 已写入文件 afiedt.buf 1 declare 2 str varchar2(800); 3 begin 4 str := test_yl1('plain'); 5 dbms_output.put_line(substrb(str,256,lengthb(str)-255)); 6* end; SQL> / declare * ERROR 位于第1行: ORA-20000: ORU-10028: line length overflow, limit of 255 bytes per line ORA-06512: 在"SYS.DBMS_OUTPUT", line 84 ORA-06512: 在"SYS.DBMS_OUTPUT", line 58 ORA-06512: 在line 5 继续郁闷......
dbms_output.put_line的每一行最大只有255 SQL> ed 已写入文件 afiedt.buf 1 declare 2 lineCount INTEGER; 3 i INTEGER; 4 initStr Varchar2(4000); 5 BEGIN 6 initStr:=test_yl1('plain'); 7 lineCount := ceil(length(initStr)/255); 8 dbms_output.put_line('Length:'||to_char(length(initStr))); 9 FOR i IN 1..lineCount LOOP 10 dbms_output.put_line('-------i--------:'||to_char(i)); 11 dbms_output.put_line(substr(initStr,1 + 255 * (i - 1),255)); 12 END LOOP; 13* END; SQL> / Length:544 -------i--------:1 plainfasfdsfafsdfasfsdfsadsfafssdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafass afsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsaf sdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafs -------i--------:2 afsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsds dfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsaf safassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfs -------i--------:3 afsafassafsafsdsdfsafsafassafsafsdPL/SQL 过程已成功完成。
to:lynx test_yl11的代码传上来学习学习
to:all 我的问题已经解决啦,原来有些问题试验时没有分清楚. 如果有 proc_a 和proc_b, proc_b 调用proc_a 时就有麻烦. 如果有 func_a 和proc_b, proc_b 调用func_a 结果还是很帅的,令人满意.CREATE OR REPLACE FUNCTION EDU.test_varchar2( org_id in varchar, t_SRC_UnitIDs in varchar2) RETURN varchar2 IS str2 varchar2(3000); lg number; p number; tmp varchar(1); COUNT1 NUMBER(6) := 0; COUNT2 NUMBER(6); ssql varchar2(3000); unit_id UNIT.ID%TYPE; TYPE UNITs_CUR_REF IS REF CURSOR; UNITs_CUR UNITs_CUR_REF; SRC_UnitIDs varchar2(3000);BEGIN -- DBMS_OUTPUT.ENABLE(20000000); str2 := 'fasfdsfafsdfasfsdfsadsfafs' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ; /* ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd' ; */ DBMS_OUTPUT.PUT_LINE('app1'); DBMS_OUTPUT.PUT_LINE('app2'); DBMS_OUTPUT.PUT_LINE('app3'); RETURN (str2); END; / CREATE OR REPLACE FUNCTION EDU.test_varchar4( str in varchar2) RETURN varchar2 IS str2 varchar2(3000); sss varchar2(3000); lg number; lineCount INTEGER; i INTEGER; initStr Varchar2(4000); BEGIN initStr:=test_varchar2('180','0'); lineCount := ceil(length(initStr)/255); dbms_output.put_line('Length:'||to_char(length(initStr))); FOR i IN 1..lineCount LOOP dbms_output.put_line('-------i--------:'||to_char(i)); dbms_output.put_line(substr(initStr,1 + 255 * (i - 1),255)); END LOOP; initStr := 'end'; return initStr; END; /CREATE OR REPLACE PROCEDURE EDU.PROC_Get_Units_OffspringIDs2( param1 in varchar, param2 IN varchar2, SRC_UnitIDs OUT varchar2 ) AS BEGIN DECLARE ssql varchar2(3000); BEGIN SRC_UnitIDs := test_varchar4(param1); SRC_UnitIDs := test_varchar2(param1); END; END; /
oracle的参数传递绝对不会比sqlserver差
甚至提供了按地址传参方法以实现大参数大队想级别的灵活传递
函数调用时甚至可以对参数进行非顺序调用!
还是深入研究一下吧
oracle不会想你所看到的那么简单
就单单从语言风格上oracle就已经远远比sqlserver强出很多
在整个体系结构上,sqlserver 则更是望尘莫及!
当
Output from Stored Procedures and Triggers 时
出现
ORU-10027: buffer overflow
ORU-10028: line length overflow
那我说的问题你能解决先?
着急上火,没时间深入研究啦!
str in varchar2)
RETURN varchar2 IS
str2 varchar2(3000);
lg number;
BEGIN
lg := length(str);
str2 := 'fasfdsfafsdfasfsdfsadsfafs'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
;
RETURN (str2);
END;
/
传说中oracle达人快快现身啊!!
SQL> CREATE OR REPLACE FUNCTION test_varchar2(
2 str in varchar2)
3 RETURN varchar2 IS
4 str2 varchar2(3000);
5 lg number;
6 BEGIN
7 lg := length(str);
8 str2 := 'fasfdsfafsdfasfsdfsadsfafs'
9 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
10 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
11 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
12 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
13 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
14 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
15 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
16 ;
17 RETURN (str2);
18 END;
19 /函数已创建。
不出 ORU-10028: line length overflow 的错误?
2 str in varchar2)
3 RETURN varchar2 IS
4 str2 varchar2(3000);
5 lg number;
6 BEGIN
7 lg := length(str);
8 str2 := 'fasfdsfafsdfasfsdfsadsfafs'
9 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
10 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
11 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
12 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
13 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
14 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
15 ||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
16 ;
17 RETURN (str2);
18 END;
19 /函数已创建。
SQL> declare
2 str varchar2(4000);
3 begin
4 str := test_varchar2('plain');
5 end;
6 /PL/SQL 过程已成功完成。SQL>
只是我的oracle是临时装的,有点问题
不能使用dbms_output包,看不到执行结果
成功执行却是没有任何问题的
test_varchar2(
str in varchar2)就会发现错误啦
declare
str varchar2(4000);
begin
str := test_varchar2('plain');
--dbms_output.put_line(str);
end;
/
PL/SQL 过程已成功完成。
SET SERVEROUTPUT ON SIZE 1000000
declare
str varchar2(4000);
begin
str := test_varchar2('plain');
dbms_output.put_line(str);
end;
/
declare
*
ERROR 位于第1行:
ORA-06502: PL/SQL: 数字或值错误
ORA-06512: 在"SYS.DBMS_OUTPUT", line 57
ORA-06512: 在line 5
???????????
郁闷中........
已写入文件 afiedt.buf 1 declare
2 str varchar2(800);
3 begin
4 str := test_yl1('plain');
5 dbms_output.put_line(substrb(str,1,255));
6* end;
SQL> /
plainfasfdsfafsdfasfsdfsadsfafssdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafass
afsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsaf
sdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsPL/SQL 过程已成功完成。
SQL> ed
已写入文件 afiedt.buf 1 declare
2 str varchar2(800);
3 begin
4 str := test_yl1('plain');
5 dbms_output.put_line(substrb(str,256,lengthb(str)-255));
6* end;
SQL> /
declare
*
ERROR 位于第1行:
ORA-20000: ORU-10028: line length overflow, limit of 255 bytes per line
ORA-06512: 在"SYS.DBMS_OUTPUT", line 84
ORA-06512: 在"SYS.DBMS_OUTPUT", line 58
ORA-06512: 在line 5
继续郁闷......
SQL> ed
已写入文件 afiedt.buf 1 declare
2 lineCount INTEGER;
3 i INTEGER;
4 initStr Varchar2(4000);
5 BEGIN
6 initStr:=test_yl1('plain');
7 lineCount := ceil(length(initStr)/255);
8 dbms_output.put_line('Length:'||to_char(length(initStr)));
9 FOR i IN 1..lineCount LOOP
10 dbms_output.put_line('-------i--------:'||to_char(i));
11 dbms_output.put_line(substr(initStr,1 + 255 * (i - 1),255));
12 END LOOP;
13* END;
SQL> /
Length:544
-------i--------:1
plainfasfdsfafsdfasfsdfsadsfafssdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafass
afsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsaf
sdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafs
-------i--------:2
afsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsds
dfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfsaf
safassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsdsdfs
-------i--------:3
afsafassafsafsdsdfsafsafassafsafsdPL/SQL 过程已成功完成。
test_yl11的代码传上来学习学习
我的问题已经解决啦,原来有些问题试验时没有分清楚.
如果有 proc_a 和proc_b, proc_b 调用proc_a 时就有麻烦.
如果有 func_a 和proc_b, proc_b 调用func_a 结果还是很帅的,令人满意.CREATE OR REPLACE FUNCTION EDU.test_varchar2(
org_id in varchar,
t_SRC_UnitIDs in varchar2)
RETURN varchar2 IS
str2 varchar2(3000);
lg number;
p number;
tmp varchar(1); COUNT1 NUMBER(6) := 0;
COUNT2 NUMBER(6);
ssql varchar2(3000);
unit_id UNIT.ID%TYPE; TYPE UNITs_CUR_REF IS REF CURSOR;
UNITs_CUR UNITs_CUR_REF; SRC_UnitIDs varchar2(3000);BEGIN
-- DBMS_OUTPUT.ENABLE(20000000); str2 := 'fasfdsfafsdfasfsdfsadsfafs'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
;
/*
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
||'sdfsafsafassafsafsdsdfsafsafassafsafsdsdfsafsafassafsafsd'
;
*/
DBMS_OUTPUT.PUT_LINE('app1');
DBMS_OUTPUT.PUT_LINE('app2');
DBMS_OUTPUT.PUT_LINE('app3');
RETURN (str2);
END;
/
CREATE OR REPLACE FUNCTION EDU.test_varchar4(
str in varchar2)
RETURN varchar2 IS
str2 varchar2(3000);
sss varchar2(3000);
lg number; lineCount INTEGER;
i INTEGER;
initStr Varchar2(4000);
BEGIN
initStr:=test_varchar2('180','0');
lineCount := ceil(length(initStr)/255);
dbms_output.put_line('Length:'||to_char(length(initStr)));
FOR i IN 1..lineCount LOOP
dbms_output.put_line('-------i--------:'||to_char(i));
dbms_output.put_line(substr(initStr,1 + 255 * (i - 1),255));
END LOOP;
initStr := 'end';
return initStr;
END;
/CREATE OR REPLACE PROCEDURE EDU.PROC_Get_Units_OffspringIDs2(
param1 in varchar,
param2 IN varchar2,
SRC_UnitIDs OUT varchar2
)
AS
BEGIN
DECLARE
ssql varchar2(3000);
BEGIN
SRC_UnitIDs := test_varchar4(param1);
SRC_UnitIDs := test_varchar2(param1);
END;
END;
/