警告:在oracle中使用编译错误创建的过程

时间:2014-02-17 04:53:51

标签: oracle stored-procedures plsql oracle10g

创建表:

create table customer (Name varchar2(10), Address varchar(40), Contact number);

为INSERT创建程序:

CREATE OR REPLACE PROCEDURE SP_CUSTOMER (
p_name customer.Name%TYPE,
p_address customer.Address%TYPE,
p_contact customer.Contact%TYPE)
IS
BEGIN
INSERT INTO customer ("Name", "Address", "Contact")
VALUES (p_name, p_address, p_contact);
COMMIT;
END;
/

错误: IT显示:警告:使用编译错误创建过程。

CREATE PROCEDURE FOR SELECT:

CREATE OR REPLACE PROCEDURE SP_SELECT_CUSTOMER (
p_name customer.Name%TYPE,
p_address customer.Address%TYPE,
p_contact customer.Contact%TYPE)
IS
BEGIN
SELECT Name, Address, Contact FROM customer;
END;
/

错误: IT显示:警告:使用编译错误创建过程。

问题是什么?如何解决呢?

3 个答案:

答案 0 :(得分:8)

  1. 每当你在SQL * Plus中编译某些东西并得到“编译错误”时,你要做的第一件事就是SHOW ERRORS,它会告诉你实际出了什么问题。

  2. 您的第一个过程存在一个问题,即列名与表中的列名不匹配。您的表定义包含NameAddressContact,但由于您没有使用双引号,因此列名称实际上为NAMEADDRESSCONTACT - 但你的insert语句使用双引号,因此它会尝试插入Name等。只需删除双引号,你就不需要它们了。

  3. 在第二个过程中,PL / SQL中有一个SELECT语句,但是没有指定将结果数据放在何处。您至少需要一个INTO子句,或者对结果记录执行LOOP。

答案 1 :(得分:1)

- 您无需将列放在引号

CREATE OR REPLACE PROCEDURE SP_CUSTOMER (
p_name customer.Name%TYPE,
p_address customer.Address%TYPE,
p_contact customer.Contact%TYPE)
IS
BEGIN
INSERT INTO customer (Name, Address, Contact)
VALUES (p_name, p_address, p_contact);
COMMIT;
END;
/

- 只需使用refcursor返回结果集

CREATE OR REPLACE PROCEDURE SP_SELECT_CUSTOMER (
p_cust_details OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_cust_details for SELECT Name, Address, Contact FROM customer;
END;
/

编辑如果您想根据名称查找详细信息,请传递IN参数并将其用作过滤条件。

CREATE OR REPLACE PROCEDURE SP_SELECT_CUSTOMER (
p_cust_name    IN   customer.Name%TYPE
p_cust_details OUT SYS_REFCURSOR)
IS
BEGIN
OPEN p_cust_details for SELECT Name, Address, Contact FROM customer
                         WHERE name=p_cust_name ;
END;
/

答案 2 :(得分:0)

select * from user_errors where name='SP_SELECT_CUSTOMER'