这个package为什么编译不了?

menhal 2008-02-26 02:27:48

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




...全文
147 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sulins 2008-02-26
  • 打赏
  • 举报
回复
错误提示也不给出!!!
chliang315 2008-02-26
  • 打赏
  • 举报
回复
提示什么错误呀。
Janeweiz 2008-02-26
  • 打赏
  • 举报
回复
把包里面每个单独的函数或者存储过程拿出来编译一下(其中调用函数的存储过程可以把调用的那一行注释掉),看有没有错误,这样很容易看出问题所在.
TodayZ 2008-02-26
  • 打赏
  • 举报
回复
看了下代码,应该没有什么问题。不过你要注意两个地方:
1。你是否使用sunyard用户创建这个package?如果不是,建议把这句
sunyard.pack_sunyard_test.proc_sunyard_test1(i_id,v_name);
改成 pack_sunyard_test.proc_sunyard_test1(i_id,v_name);
2。检查表 test_a 和 test_b 是否在你创建package的用户下存在?

p.s. 你能用show error 显示具体的错误信息。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧