oracle存储过程,输出参数为数组的问题?紧急求助!寝室疯了。。

bean115 2010-12-26 12:13:05
首先写了一个包,包头声明了个自定义数组类型:TYPE lgn IS TABLE OF NVARCHAR2(20);
在包体里写了存储过程如下:
procedure country_languages
(
country_n in NVARCHAR2,
c_n out NVARCHAR2,
l_ns out lgn,
ofls out lgn

) as
c_id NVARCHAR2(20);
l_id NVARCHAR2(20);
l_n NVARCHAR2(20);
o_n NVARCHAR2(20);
if_o char;
n number:=0;

cursor mycursor1 is
select b.language_id, b.country_id from wf_countries a, wf_spoken_languages b where a.country_name=country_n and b.country_id=a.country_id;
cursorrecord mycursor1%rowtype;

begin
l_id:='';
open mycursor1;

LOOP
fetch mycursor1 into cursorrecord;
exit when mycursor1%notfound;
l_id:=cursorrecord.language_id;
c_id:=cursorrecord.country_id;
select language_name into l_n from wf_languages where language_id=l_id;
select if_official into if_o from wf_spoken_languages where country_id=c_id and language_id=l_id;


n:=n+1;
l_ns(n):=l_n;

if if_o='1'then
ofls(n):=l_n;

end if;


end loop;
close mycursor1;

c_n:=country_n;


end country_languages;

现在存储过程编译通过,但是在命令行里调用存储过程时出错:
SQL> declare
2 -- Local variables here
3 i integer;
4 TYPE lgn IS VARRAY(20) OF NVARCHAR2(20); --可变数组
5 c_n NVARCHAR2(20);
6 l_ns varray;
7 ofls varray;
8 begin
9 -- Test statements here
10 traveler_assistance_package.country_languages('巴西', c_n,l_ns, ofls);
11 end;
12 /
l_ns varray;
*
第 6 行出现错误:
ORA-06550: 第 6 行, 第 13 列:
PLS-00201: 必须声明标识符 'VARRAY'
ORA-06550: 第 6 行, 第 13 列:
PL/SQL: Item ignored
ORA-06550: 第 7 行, 第 13 列:
PLS-00201: 必须声明标识符 'VARRAY'
ORA-06550: 第 7 行, 第 13 列:
PL/SQL: Item ignored
ORA-06550: 第 10 行, 第 61 列:
PLS-00320: 此表达式的类型声明不完整或格式不正确
ORA-06550: 第 10 行, 第 3 列:
PL/SQL: Statement ignored

并且在JSP里面调用的话,也会提示出错:
java.sql.SQLException: 无效的名称模式: FOF.lgn

明明lgn在包头里面已经声明了,怎么会出错呢?
是不是数组lgn没有初始化呢?我也不知道在哪里初始化。。。

大侠救救我们吧
...全文
251 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bean115 2010-12-26
[Quote=引用 2 楼 wangsiqishiwangba 的回复:]

求解呀。。。求解呀
[/Quote]

这么晚了,你也没睡啊!可怜呀~
回复
求解呀。。。求解呀
回复
bony_chelsea 2010-12-26
同问同问!
那位大侠帮帮忙吧
回复
永生天地 2010-12-26
楼上很准确
回复
Oraclefans_ 2010-12-26
包头你的type的作用域只限在你的包体里,你在plsql块你调用的时候声明的plsql块和包头声明的type是两个不同的数据类型,肯定报错。。。你把包头你的type使用全部定义的形式,还有就是你l_ns varray也不对,应该是l_ns lgn,因为变量后面必须跟数据类型,这里就你的自定义类型。
首先声明全部type
create or replace TYPE lgn IS TABLE OF NVARCHAR2(20);

然后包头的type去掉,包体使用第一步使用的type

最后调用

declare
-- Local variables here
i integer;
--TYPE lgn IS VARRAY(20) OF NVARCHAR2(20); --可变数组
c_n NVARCHAR2(20);
l_ns lgn;
ofls lgn;
begin
-- Test statements here
traveler_assistance_package.country_languages('巴西', c_n,l_ns, ofls);
end;


回复
bony_chelsea 2010-12-26
[Quote=引用 5 楼 oraclefans_ 的回复:]
包头你的type的作用域只限在你的包体里,你在plsql块你调用的时候声明的plsql块和包头声明的type是两个不同的数据类型,肯定报错。。。你把包头你的type使用全部定义的形式,还有就是你l_ns varray也不对,应该是l_ns lgn,因为变量后面必须跟数据类型,这里就你的自定义类型。
首先声明全部type
create or replace TYPE lgn IS TABLE O……
[/Quote]

谢谢啊
概念不清。。。
回复
心中的彩虹 2010-12-26
[Quote=引用楼主 bean115 的回复:]
首先写了一个包,包头声明了个自定义数组类型:TYPE lgn IS TABLE OF NVARCHAR2(20);
在包体里写了存储过程如下:
procedure country_languages
(
country_n in NVARCHAR2,
c_n out NVARCHAR2,
l_ns out lgn,
ofls out lgn

) ……
[/Quote]








SQL> declare
2 -- Local variables here
3 i integer;
4 TYPE lgn IS VARRAY(20) OF NVARCHAR2(20); --可变数组
5 c_n NVARCHAR2(20);
6 l_ns lgn:=lgn() ;--这里 ---或者用你的包名加可变数组的名称 包名.lgn(上面的声明就不需要了)
7 ofls lgn:=lgn() ; --这里
8 begin
9 -- Test statements here
10 traveler_assistance_package.country_languages('巴西', c_n,l_ns, ofls);
11 end;













回复
tangren 2010-12-26
不一定要声明全局的type
可以直接引用包中声明的类型lgn,引用方式:<包名>.<类型名>
假设你的包名为:your_pack,则在dclare块中的变量声明为:
l_ns your_pack.lgn;
ofls your_pack.lgn;
回复
相关推荐
发帖
Oracle
创建于2007-09-28

1.6w+

社区成员

Oracle开发相关技术讨论
申请成为版主
帖子事件
创建了帖子
2010-12-26 12:13
社区公告
暂无公告