现想实现一个更新的存储过程 , 因有部分参数除外 所以自定义了一个数组.
编译什么的都成功了, 但是用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;
编译什么的都成功了, 但是用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;
解决方案 »
- 关于分区表查询效率问题
- 这样的计费怎么写呢,时间怎么表示
- 求SGA设置
- SQL-Loader:装入数据时,怎么把主表生成的记录ID同时写入附表? 详见内容
- 存储过程,取返回值和传sql问题
- 关于多用户同时修改一个表的问题
- 急!!!!!!!查询表中某列上是否有重复记录,有就显示的问题,高效率的!
- 哭诉: 数据库为什么会当掉?error 221
- oracle中 select语句怎样删除某个列相同的记录
- 视图中有数据,但用Enterprise Manager Console或SQL Plus查看都为空,可能是什么原因?在线等!THANKS!!!
- 如何在sqlplus里面逐行读取文件并进行查询
- 求一条SQL,请高手来解答
自己添加的话,
1.类型列表里也没有我自定义的数组类型.
2.即使乱选一个数据类型的时候, 会报错 except_array 未定义.
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;
/
直接传参调用时可以的,无语.
谢谢各位了. 代码贴出来分享下 .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;