现想实现一个更新的存储过程 , 因有部分参数除外 所以自定义了一个数组.
编译什么的都成功了, 但是用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;
解决方案 »
- oracle求一个查询语句
- ALTER TABLE CODINGQUESTION DROP COLUMN username 报 ora-00904 标识符无效
- oracle连接远程数据库的问题
- 关于数据库之间的转换问题??
- 请大家帮忙!!!!
- 高分求教一个SQL文的写法,多谢了。
- 怎样在触发器中得到Index-by表中的记录??
- 【请问】execute immediate ... 与不用execute immediate直接执行SQL语句有什么区别
- 烦人的SQL语句
- 我想将我的新程序定期从服务端器COPY到客户端,有什么方便的工具,请大家推荐一下?谢谢
- 如何在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;