当前位置: 代码迷 >> Oracle管理 >> 这个package为什么编译不了?该怎么解决
  详细解决方案

这个package为什么编译不了?该怎么解决

热度:69   发布时间:2016-04-24 05:56:56.0
这个package为什么编译不了?
SQL code
create or replace package pack_sunyard_test is  type refcur is ref cursor;/******************************************************************************--函数名称:        func_sunyard_test--作者:           sunyard_zhengxl--时间:           2007年04月01日--使用源表名称:    sunyard.tset_a(测试表A)                   sunyard.tset_b(测试表B)--目标表明称:     --参数说明:--                 i_id                (ID值)--                 o_name              (返回NAME值)--功能:           oracle plsql开发示例-函数--解释:******************************************************************************/function func_sunyard_test(                           i_id in number     --ID值                          )   return varchar2;  /******************************************************************************--存储过程名称:        proc_sunyard_test1--作者:               sunyard_zhengxl--时间:               2007年04月01日--使用源表名称:        sunyard.tset_a(测试表A)                       sunyard.tset_b(测试表B)--目标表明称: --参数说明:--                     i_id                (ID值)--                     o_name              (返回NAME值)     --功能:               oracle plsql开发示例-数据类型、控制结构、调用函数--解释:******************************************************************************/procedure proc_sunyard_test1(                             i_id    in  number,       --ID值                             o_name  out varchar2      --姓名                            );                            /******************************************************************************--存储过程名称:        proc_sunyard_test2--作者:               sunyard_zhengxl--时间:               2007年04月01日--使用源表名称:        sunyard.tset_a(测试表A)                       sunyard.tset_b(测试表B)--目标表明称: --参数说明:--                     i_id                (ID值)--                     o_name              (返回NAME值)     --功能:               oracle plsql开发示例-调用过程、游标、游标变量、动态sql--解释:******************************************************************************/procedure proc_sunyard_test2(                             i_id    in  number,       --ID值                             o_name  out varchar2,     --姓名                             o_cur   out refcur        --游标变量                            );end pack_sunyard_test; /create or replace package body pack_sunyard_test is/******************************************************************************--函数名称:        func_sunyard_test--作者:           sunyard_zhengxl--时间:           2007年04月01日--使用源表名称:    sunyard.tset_a(测试表A)                   sunyard.tset_b(测试表B)--目标表明称:     --参数说明:--                 i_id                (ID值)--                 o_name              (返回NAME值)--功能:           oracle plsql开发示例-函数--解释:******************************************************************************/function func_sunyard_test(                           i_id in number     --ID值                          )   return varchar2 is  v_name    varchar2(10);  --姓名  begin  --根据输入的ID查询相应的NAME值  select a.name  into v_name  from test_a a   where a.id = i_id;  return v_name;    exception      when others then         raise;--抛出异常到调用模块end func_sunyard_test;procedure proc_sunyard_test1(                             i_id    in  number,       --ID值                             o_name  out varchar2      --姓名                            ) is  v_code1  number;  v_code2  number(17,2);  v_name   varchar2(100);  begin      --number显式或隐式转换成varchar2时会将前面的0转换掉      v_name := '001';      v_code1 := v_name;            --控制结构      if v_name = '001' then         v_code1 := 0;      elsif v_name = '002' then         v_code1 := 1;      else          v_code1 := -1;      end if;            case v_name        when '001' then v_code1 := 0;        when '002' then v_code1 := 1;        else v_code1 := -1;      end case;            loop          v_code1 := v_code1 + 1;          exit when v_code1 > 4;      end loop;            while v_code1 < 10 loop          v_code1 := v_code1 + 1;      end loop;            for v_code2 in 1..10 loop          v_code1 := v_code1 + v_code2;      end loop;             --调用函数      o_name := func_sunyard_test(i_id);      exception          when others then             o_name := sqlcode||'-'||sqlerrm;             return;end proc_sunyard_test1;procedure proc_sunyard_test2(                             i_id    in  number,       --ID值                             o_name  out varchar2,     --姓名                             o_cur   out refcur        --游标变量                            ) is  v_id     number;  v_name   varchar2(100);  v_sql    varchar2(2000);    cursor cur_select is                       select a.id,a.name                        from test_a a                       where a.id >= 3;  cursor cursor_select(id number) is                             select a.id,a.name                              from test_a a                             where a.id >= id;     begin          --调用过程     sunyard.pack_sunyard_test.proc_sunyard_test1(i_id,v_name);      --隐式游标      select a.name      into v_name      from test_a a      where a.id = i_id;      --小范围异常控制      begin           select a.name          into v_name          from test_a a          where a.id = i_id + 1;                  exception            when others then               v_name := '未匹配';               return;      end;            --小技巧      select nvl(max(a.name),'未匹配')      into v_name       from test_a a      where a.id = i_id + 2;            o_name := v_name;            --显式游标      open cur_select;      loop        fetch cur_select into v_id,v_name;          exit when cur_select%notfound;--此行若放到输出语句之后,则会出现重复行          o_name := to_char(v_id)||'-'||v_name;          dbms_output.put_line(o_name);      end loop;      close cur_select;            --游标for循环      for c_cur in cursor_select(3) loop        v_id := c_cur.id;        v_name := c_cur.name;        o_name := to_char(v_id)||'-'||v_name;        dbms_output.put_line(o_name);      end loop;              --游标变量      v_name := '10000001';      v_sql := ' select a.code,a.name '             ||' from test_a a,test_b b '             ||' where a.id = b.id '               ||' and a.id < '||i_id               ||' and a.code != '''||v_name||'''';      open o_cur for v_sql;            --动态sql      v_sql := ' select a.id,a.name '             ||' from test_a a '             ||' where a.id = '||i_id;      execute immediate v_sql into v_id,v_name;            v_sql := ' select a.id,a.name '             ||' from test_a a '             ||' where a.id = :i_id';      execute immediate v_sql into v_id,v_name using i_id;            --DDL语句      delete from test_a a where a.id = 10;            update test_a a set a.name = '' where a.id = 11;            insert into test_a(id,code,name,age,address) values(10,'10000010','十',10,'石');            commit;      exception          when others then             o_name := sqlcode||'-'||sqlerrm;             return;end proc_sunyard_test2;end pack_sunyard_test;/
  相关解决方案