真的没有更好的办法?
Oracle 比SQL Server 菜?

解决方案 »

  1.   

    不懂什么意思
    oracle的参数传递绝对不会比sqlserver差
    甚至提供了按地址传参方法以实现大参数大队想级别的灵活传递
    函数调用时甚至可以对参数进行非顺序调用!
    还是深入研究一下吧
    oracle不会想你所看到的那么简单
    就单单从语言风格上oracle就已经远远比sqlserver强出很多
    在整个体系结构上,sqlserver 则更是望尘莫及!
      

  2.   

    to:jiezhi(西域浪子) 

    Output from Stored Procedures and Triggers 时
    出现
    ORU-10027: buffer overflow
    ORU-10028: line length overflow
      

  3.   

    to:greatplain(蓝屏) 
    那我说的问题你能解决先?
    着急上火,没时间深入研究啦!
      

  4.   

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

  5.   

    呵呵,这个问题就没人解决吗?
    传说中oracle达人快快现身啊!!
      

  6.   

    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  /函数已创建。
      

  7.   

    to: yhdlong(东东) 请把上面的FUNCTION  在8.1.7 for linux 中执行一下,
    不出 ORU-10028: line length overflow 的错误?
      

  8.   

    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包,看不到执行结果
    成功执行却是没有任何问题的
      

  9.   

    to:greatplain(蓝屏) 如果你现在用另外一个存储过程或者函数调用
    test_varchar2(
      str in varchar2)就会发现错误啦
      

  10.   

    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
    ???????????
    郁闷中........
      

  11.   

    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
    继续郁闷......
      

  12.   

    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 过程已成功完成。
      

  13.   

    to:lynx
    test_yl11的代码传上来学习学习
      

  14.   

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