首先写了一个包,包头声明了个自定义数组类型: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没有初始化呢?我也不知道在哪里初始化大侠救救我们吧
在包体里写了存储过程如下:
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没有初始化呢?我也不知道在哪里初始化大侠救救我们吧
首先声明全部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;
可以直接引用包中声明的类型lgn,引用方式:<包名>.<类型名>
假设你的包名为:your_pack,则在dclare块中的变量声明为:
l_ns your_pack.lgn;
ofls your_pack.lgn;
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;