【问题标题】:Warning: Procedure created with compilation errors in oracle警告:在 oracle 中创建的过程存在编译错误
【发布时间】:2014-03-16 06:34:21
【问题描述】:

创建表:

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

为插入创建过程:

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 SHOWS:警告:创建的过程存在编译错误。

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 SHOWS:警告:创建的过程存在编译错误。

有什么问题。?如何解决?

【问题讨论】:

    标签: oracle stored-procedures plsql oracle10g


    【解决方案1】:
    1. 每当您在 SQL*Plus 中编译某些内容时遇到“编译错误”,您要做的第一件事就是发送电子邮件至SHOW ERRORS,它会告诉您实际出了什么问题。

      李>
    2. 您的第一个过程存在列名与表中的列名不匹配的问题。您的表定义有NameAddressContact,但由于您没有使用双引号,因此列名实际上是NAMEADDRESSCONTACT - 但您的插入语句使用双引号,所以它会尝试插入Name 等。只需去掉双引号,这里不需要它们。

    3. 在您的第二个过程中,您在 PL/SQL 中有一个 SELECT 语句,但您没有指定将结果数据放在哪里。您至少需要一个INTO 子句,或者可能对结果记录执行一个循环。

    【讨论】:

      【解决方案2】:

      --您不需要将列放在引号中

      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;
      /
      

      EDIT如果要根据名称查找详细信息,则传递一个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;
      /
      

      【讨论】:

      • 嗨!我还有一个疑问。我是甲骨文的新手。所以,我不知道如何在 oracle 中创建 SP。这里以如何使用 where 条件为例。 OPEN p_cust_details for SELECT Name, Address, Contact FROM customer WHERE ID=@ID;.???
      • @Sesuraj:请找到我的代码的编辑部分,我使用 IN 参数将其用作过滤条件
      【解决方案3】:
      select * from user_errors where name='SP_SELECT_CUSTOMER'
      

      【讨论】:

        猜你喜欢
        • 2013-06-13
        • 2012-01-20
        • 1970-01-01
        • 1970-01-01
        • 2019-11-08
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多