使用编译错误创建VARRAY的过程

时间:2013-06-16 10:33:12

标签: sql database oracle plsql oracle10g

我正在尝试创建一个接受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)上述程序中的错误在哪里?

请告诉我这些。

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