2013-03-31 39 views
2

我想从下面的过程创建一个包创建包的sqlplus

CREATE OR REPLACE PROCEDURE insert_rows 
(pl_deptno dept.deptno%TYPE, pl_dname dept.dname%TYPE, pl_loc dept.loc%TYPE 
) AS 
BEGIN 
INSERT INTO dept 
(deptno,dname,loc) 
values (pl_deptno,pl_dname,pl_loc); 
commit; 
end insert_rows; 
/

到目前为止,这是我的包秒其中,创建优良

create or replace package fpf 
is 
procedure insert_rows 
    (p_deptno IN dept.deptno%TYPE, 
    p_dname IN dept.dname%TYPE, 
    p_loc IN dept.loc%TYPE); 
end fpf; 
/

但是,当我创建包体,我收到编译错误,有什么想法?

create or replace package body fpf 
as 
procedure insert_rows 
    (p_deptno IN dept.deptno%TYPE, 
    p_dname IN dept.dname%TYPE, 
    p_loc IN dept.loc%TYPE) 
as 
BEGIN 
INSERT INTO dept 
(deptno,dname,loc) 
values (pl_deptno,pl_dname,pl_loc); 
end insert_rows; 
end fpf; 
/

回答

4

当您收到编译错误时,您需要查看收到的错误。在SQL * Plus,你可以做到这一点使用show errors

SQL> create or replace package body fpf 
    2 as 
    3 procedure insert_rows 
    4  (p_deptno IN dept.deptno%TYPE, 
    5  p_dname IN dept.dname%TYPE, 
    6  p_loc IN dept.loc%TYPE) 
    7 as 
    8 BEGIN 
    9 INSERT INTO dept 
10 (deptno,dname,loc) 
11 values (pl_deptno,pl_dname,pl_loc); 
12 end insert_rows; 
13 end fpf; 
14/

Warning: Package Body created with compilation errors. 

SQL> sho err 
Errors for PACKAGE BODY FPF: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
9/1  PL/SQL: SQL Statement ignored 
11/29 PL/SQL: ORA-00984: column not allowed here 

这些错误是告诉你,编译器认为,在第11行关键字,列29列名和列名是不允许的命令在你的代码中的那一点。第11行第29列是pl_loc标识符。据推测,你不打算成为一个专栏名称的参考。据推测,你打算这是一个参数的名称。但是Oracle不会将该标识符识别为参数。这是因为您的参数名为p_loc而不是pl_loc(请注意额外的l)。

如果您更正所有三个参数的名称,代码编译

Wrote file afiedt.buf 

    1 create or replace package body fpf 
    2 as 
    3 procedure insert_rows 
    4  (p_deptno IN dept.deptno%TYPE, 
    5  p_dname IN dept.dname%TYPE, 
    6  p_loc IN dept.loc%TYPE) 
    7 as 
    8 BEGIN 
    9 INSERT INTO dept 
10 (deptno,dname,loc) 
11 values (p_deptno,p_dname,p_loc); 
12 end insert_rows; 
13* end fpf; 
SQL>/

Package body created.