oracle 警告:在终端中创建的过程有编译错误

2w3kk1z5  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(95)

创建表格:

CREATE TABLE CUSTOMER 
(
    CUST_NUM    NUMBER PRIMARY KEY,
    CUST_LNAME  VARCHAR(15) NOT NULL,
    CUST_FNAME  VARCHAR(15) NOT NULL,
    CUST_BALANCE    NUMBER(9,2) DEFAULT 0.00
);

我创建了这个程序:

CREATE OR REPLACE PROCEDURE PRC_ADD_CUSTOMER
    (IN cust_num INTEGER,
     IN cust_lname varchar(15),
     IN cust_fname varchar(15),
     IN cust_balance number(9,2)) 
BEGIN
    INSERT INTO CUSTOMER (CUST_NUM, CUST_LNAME, CUST_FNAME, CUST_BALANCE)
    VALUES (cust_num, cust_lname, cust_fname, cust_balance);

    COMMIT;
END;
/

我得到这个错误:
警告:创建的过程存在编译错误。
我该如何解决?谢谢你

pdsfdshx

pdsfdshx1#

在Oracle中,您需要:

  • 删除签名中类型的精度;
  • IN位于参数的标识符之后;
  • 在签名和BEGIN之间添加IS(或AS)关键字;
  • VARCHARVARCHAR2的别名)。

就像这样:

CREATE OR REPLACE PROCEDURE PRC_ADD_CUSTOMER(
  p_cust_num     IN INTEGER,
  p_cust_lname   IN varchar2,
  p_cust_fname   IN varchar2,
  p_cust_balance IN number
)
IS
BEGIN
  INSERT INTO CUSTOMER (CUST_NUM, CUST_LNAME, CUST_FNAME, CUST_BALANCE)
  VALUES(p_cust_num, p_cust_lname, p_cust_fname, p_cust_balance);
END;
/
  • 注意:您不应该在过程中使用COMMIT,因为它会阻止您将多个过程链接在一起,然后在后面的过程失败时对它们使用ROLLBACK。相反,COMMIT来自您用来调用过程的代码。
  • 注2:将PL/SQL变量命名为与列名不同的名称也是一种好的做法,这样当您在查询中使用PL/SQL变量时,它们不会被本地定义的SQL列隐藏。

fiddle

ojsjcaue

ojsjcaue2#

我得到的错误是:警告:创建的过程存在编译错误。我该如何解决?
如果你使用了一些GUI工具--比如TOAD或者SQL Developer --你会 * 直观地 * 知道你的代码有问题。例如,这是TOAD:

基本上,它说IN放错了位置(参数名在前,可选IN/OUT(或两者),数据类型没有精度)。
如果使用命令行工具(如SQL*Plus)

SQL> CREATE OR REPLACE PROCEDURE PRC_ADD_CUSTOMER(
  2  IN cust_num INTEGER,
  3  IN cust_lname varchar(15),
  4  IN cust_fname varchar(15),
  5  IN cust_balance number(9,2))
  6  BEGIN
  7  INSERT INTO CUSTOMER (CUST_NUM, CUST_LNAME, CUST_FNAME, CUST_BALANCE)
  8  VALUES(cust_num, cust_lname, cust_fname, cust_balance);
  9  COMMIT;
 10  END;
 11  /

Warning: Procedure created with compilation errors.

你得自己找出错误的原因如何实现?通过查询user_errors

SQL> select line, position, text
  2  from user_errors
  3  where name = 'PRC_ADD_CUSTOMER';

      LINE   POSITION TEXT
---------- ---------- --------------------------------------------------------------------------------
         2          1 PLS-00103: Encountered the symbol "IN" when expecting one of the following:

                         <an identifier> <a double-quoted delimited-identifier>
                         current delete exists prior

SQL>

我不会一个错误一个错误地调试你的代码。这是一个编译和 * 工作 * 的代码:

SQL> CREATE OR REPLACE PROCEDURE prc_add_customer (p_cust_num      IN INTEGER,
  2                                                p_cust_lname    IN VARCHAR2,
  3                                                p_cust_fname    IN VARCHAR2,
  4                                                p_cust_balance  IN NUMBER)
  5  IS
  6  BEGIN
  7     INSERT INTO customer (cust_num,
  8                           cust_lname,
  9                           cust_fname,
 10                           cust_balance)
 11          VALUES (p_cust_num,
 12                  p_cust_lname,
 13                  p_cust_fname,
 14                  p_cust_balance);
 15  END;
 16  /

Procedure created.

SQL> begin
  2    prc_add_customer(1, 'Little', 'Foot', 100);
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> select * from customer;

  CUST_NUM CUST_LNAME      CUST_FNAME      CUST_BALANCE
---------- --------------- --------------- ------------
         1 Little          Foot                     100

SQL>

请注意以下几点:

  • 注意正确的语法。文档存在的理由-阅读它
  • Oracle建议我们使用varchar2数据类型(而不是varchar
  • 不要将参数命名为与列名相同的名称;例如,您可以使用前缀(例如我的示例中的p_)。对于插入操作,这并不重要,但对于更新,您可能会得到意想不到的结果
  • 不要在过程中提交;让调用者决定是否提交(或不提交)

相关问题