oracle存储过程,test(测试)时传自定义类型参数问题

dream1210 2011-03-21 06:26:42
现想实现一个更新的存储过程 , 因有部分参数除外 所以自定义了一个数组.
编译什么的都成功了, 但是用plsql测试存储过程的时候,只有两个参数,自定义参数不能填写.


导致测试时报错 引用为'引用未初始化的收集' , 请各位不吝赐教,谢谢啦


自定义数组类型:

create or replace type array_num is table of number(19)


下面是存储过程代码:

create or replace procedure directory_path_change(from_catalogId integer,to_catalogId integer,except_array array_num) is
----把采购分类下的采购品平移到另一分类下, except_array 除外的采购品
tmp_ID NUMBER(19); --需要转移的采购品ID
catalog_treepath VARCHAR2(768 CHAR); --目标分类的路径

i number(10); --数组下标 从1开始
isUpdate number(1); --是否执行更新 0:不执行 ;1:执行
cursor directory_cursor is
select id from corp_directorys d where d.catalog_id = from_catalogId;
begin
select treepath into catalog_treepath from corp_catalogs where id = to_catalogId;
savepoint p1; -- 设置回滚点
open directory_cursor;
loop
fetch directory_cursor into
tmp_ID;
exit when directory_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('=============ID:');
DBMS_OUTPUT.PUT_LINE(tmp_ID);


i := 1;
isUpdate := 0;
for i in 1..except_array.count Loop
if except_array(i)=tmp_ID then
isUpdate := 1;
end if;
end loop;
if isUpdate=1 then
update corp_directorys d set d.catalog_id = to_catalogId , d.treepath = (catalog_treepath||d.id||'#') where d.id =tmp_ID;
end if;
commit;
end loop;

close directory_cursor;

--发生异常时,数据回滚
exception
when others then
dbms_output.put_line(sqlerrm);
rollback to savepoint p1;




end directory_path_change;
...全文
1037 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dream1210 2011-03-22
  • 打赏
  • 举报
回复
问题解决了. 哎... 不知道是不是plsql的存储过程test方法不能直接传数组参数.
直接传参调用时可以的,无语.
谢谢各位了. 代码贴出来分享下 .

declare
except_array array_num := array_num( 90818041);
from_catalogid number :=90818040;
to_catalogid number :=91469311;
begin
-- Call the procedure
directory_path_change(from_catalogid ,to_catalogid ,except_array);
end;

iqlife 2011-03-22
  • 打赏
  • 举报
回复
18-17:使用集合变量作为输入参数
CREATE TYPE deptno_table_type IS TABLE OF NUMBER(2);
/
CREATE TYPE dname_table_type IS TABLE OF VARCHAR2(10);
/
CREATE TYPE loc_table_type IS TABLE OF VARCHAR2(20);
/
CREATE OR REPLACE PROCEDURE add_department(
deptno_table deptno_table_type,
dname_table dname_table_type,loc_table loc_table_type)
IS
BEGIN
FORALL i IN 1..deptno_table.COUNT
INSERT INTO dept VALUES
(deptno_table(i),dname_table(i),loc_table(i));
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20012,'部门号不能重复');
END;
/
DECLARE
deptno_table deptno_table_type:=deptno_table_type(60,70,80);
dname_table dname_table_type :=dname_table_type('计划处','质量处','技术处');
loc_table loc_table_type:=loc_table_type('呼和浩特','包头','乌海');
BEGIN
add_department(deptno_table,dname_table,loc_table);
END;
/
18-18:使用集合变量作为输出参数
CREATE TYPE ename_table_type IS TABLE OF VARCHAR2(10);
/
CREATE TYPE job_table_type IS TABLE OF VARCHAR2(10);
/
CREATE OR REPLACE PROCEDURE get_emp(
dno NUMBER,ename_table OUT ename_table_type,
job_table OUT job_table_type) IS
BEGIN
SELECT ename,job BULK COLLECT INTO ename_table,job_table
FROM emp WHERE deptno=dno;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20010,'该部门不存在');
END;
/
DECLARE
ename_table ename_table_type;
job_table job_table_type;
BEGIN
get_emp(&dno,ename_table,job_table);
FOR i IN 1..ename_table.COUNT LOOP
dbms_output.put_line('姓名:'||ename_table(i)
||',岗位:'||job_table(i));
END LOOP;
END;
/
dream1210 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 changhe325 的回复:]
看报错就是因为数组没有初始化吧。
楼主可以再 写个外围过程。定义一个数组并赋值,然后调用这个。
[/Quote]
能给段代码么? 最好能经过测试的. 不要里面的逻辑 , 只要能把数组传到存储过程中就行了.
dream1210 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq646748739 的回复:]
数组类型参数except_array不能输入?
[/Quote]
是的 , 没有except_array赋值的地方.
自己添加的话,
1.类型列表里也没有我自定义的数组类型.
2.即使乱选一个数据类型的时候, 会报错 except_array 未定义.
changhe325 2011-03-21
  • 打赏
  • 举报
回复
看报错就是因为数组没有初始化吧。
楼主可以再 写个外围过程。定义一个数组并赋值,然后调用这个。
碧水幽幽泉 2011-03-21
  • 打赏
  • 举报
回复
数组类型参数except_array不能输入?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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