我正在尝试创建一个接受VARRAY
作为参数的过程,并将从表中删除一些记录。以下是我遵循的步骤:
步骤1
在包中创建VARRAY
:
create or replace package del_emp is
type rec_del_emp is varray(10) of NUMBER;
end del_emp;
第2步:
创建了程序:
create or replace procedure f_del_emp(v_emp del_emp.rec_del_emp%type) is
begin
for i in 1 .. v_emp.count
loop
delete from emp where emp_id = v_emp(i);
dbms_output.put_line('Deleted Id: ' || v_emp(i));
end loop;
commit;
end f_del_emp;
此过程是在编译错误的情况下创建的。
我尝试使用此功能检查错误:
select * from SYS.USER_ERRORS
where NAME = 'f_del_emp'
and type = 'PROCEDURE';
但是它给出了:没有选择行
我有两个问题:
1)如何在创建过程/功能时检查错误?我是否使用了正确的查询来检查错误? (需要知道这一点,以便每当我收到错误时,我都不需要有人在这里代表我检查相同的内容)
2)上述程序中的错误在哪里?
请告诉我这些。
答案 0 :(得分:3)
默认情况下,对象名称不区分大小写,但在数据字典中以大写形式存储;所以你的查询需要是:
select * from SYS.USER_ERRORS
where name = 'F_DEL_EMP'
and type = 'PROCEDURE';
(虽然使用f_
作为过程的前缀而不是函数,但似乎有点奇怪。)
如果您在SQL * Plus或SQL Developer中创建它,也可以show errors
。
至于你的程序有什么问题,我可以立即看到两个问题。 rec_del_emp
已经是一个类型,因此您不需要参数声明中的%type
。并且for ... loop
构造中有空格,我认为这会导致错误,但现在无法检查:
create or replace procedure f_del_emp(v_emp del_emp.rec_del_emp) is
begin
for i in 1..v_emp.count
loop
...
答案 1 :(得分:3)
create or replace package del_emp is
type rec_del_emp is varray(10) of NUMBER;
end del_emp;
-- PACKAGE DEL_EMP compiled
create or replace procedure f_del_emp(v_emp del_emp.rec_del_emp%type) is
begin
for i in 1 .. v_emp.count
loop
delete from emp where emp_id = v_emp(i);
dbms_output.put_line('Deleted Id: ' || v_emp(i));
end loop;
commit;
end f_del_emp;
/*
PROCEDURE F_DEL_EMP compiled
Errors: check compiler log
*/
SHOW ERRORS;
/*
1/27 PLS-00206: %TYPE must be applied to a variable, column, field or attribute, not to "DEL_EMP.REC_DEL_EMP"
0/0 PL/SQL: Compilation unit analysis terminated
*/
create or replace procedure f_del_emp(v_emp del_emp.rec_del_emp) is
begin
for i in 1 .. v_emp.count
loop
EXECUTE IMMEDIATE 'delete from emp where emp_id = ' || v_emp(i);
dbms_output.put_line('Deleted Id: ' || v_emp(i));
end loop;
commit;
end f_del_emp;
-- PROCEDURE F_DEL_EMP compiled