oracle SQL过程编译错误

nzk0hqpo  于 2022-12-22  发布在  Oracle
关注(0)|答案(1)|浏览(188)

我们有两张table:账户和客户

CREATE TABLE Client ( NumClient NUMBER(3) NOT NULL PRIMARY KEY,
                      ClientName VARCHAR (25) NOT NULL,
                      City VARCHAR (25) NOT NULL
                    );
                    
CREATE TABLE Compte ( NumCompte NUMBER(1) NOT NULL PRIMARY KEY,
                      NumClient NUMBER(3) NOT NULL REFERENCES Client(NumClient),
                      DateOpening DATE NOT NULL, 
                       balance FLOAT ,
                      PMVR NUMBER DEFAULT 0
                    );

程序如下:
OpenAccount(以数字表示的NumCli,以数字表示的Amount)
此过程为客户(NumCli)创建具有第一个余额(Amount)的新帐户:

  • NumCaccount由序列自动分配;
  • DateOpen是系统日期;
  • 金额〉0;
  • PMVR初始化为0;

如果客户不存在,则存在错误。
我有一个序列叫做:

CREATE SEQUENCE seqClient START WITH 101 INCREMENT BY 1;    

CREATE SEQUENCE seqAccount START WITH 1 INCREMENT BY 1;

以下是程序文本

CREATE OR REPLACE PROCEDURE OpenAccount(NumCli IN NUMBER, Amount in NUMBER)
IS
    non-existent_client EXCEPTION;
   PRAGMA EXCEPTION_INIT (non-existent_client, -2291);
BEGIN
   IF (Amount < 0)
   THEN
      RAISE_APPLICATION_ERROR (-20002,'the amount must be greater than 0');
   ELSE
      INSERT INTO Account (AccountNumber,
                           ClientNumber,
                           DateOpening date,
                           Balance,
                           PMVR)
           VALUES (seqCount.NEXTVAL,
                   NumCli,
                   TO_DATE (sysdate,'DD.MM.YY'),
                   Amount,
                   0);
   END IF;
EXCEPTION
   WHEN 
    non-existent_customer
   THEN
      DBMS_OUTPUT.PUT_LINE (
         Client No' ||| TO_CHAR (NumCli) ||| ' non-existent');
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (
         Oracle error:' |||| SQLCODE ||| '; Oracle message: ||||| SQLERRM);
END;

当我这样运行时

execute OpenAccount(101,1600);

我得到这个错误:
9/9 PL/SQL:已忽略SQL语句
1981年10月PL/SQL:ORA-00984:此处不允许列
www.DeepL.com/Translator翻译(免费版)

jhdbpxl9

jhdbpxl91#

一些反对意见:

  • 这似乎不是全部代码。* 什么 * 应该引发non_existent_client异常?
  • 您要插入的值来自何处?
  • 什么是new函数?在Oracle中,我们使用sysdate
  • 你确实喜欢烟斗,这是显而易见的,但是-不要经常使用它们(提示:它们在dbms_output调用中的用法)
  • 命名表列时不允许使用空格(insert语句)
  • 减号不应用作单词分隔符(exception名称)
  • when others是无用的;我建议您删除它。或者,如果您坚持,在dbms_output之后立即删除raise

这个看起来更好;它会编译吗,不知道,因为我没有你的表

CREATE OR REPLACE PROCEDURE OpenAccount(NumCli IN NUMBER, Amount in NUMBER)
IS 
   non_existent_client  EXCEPTION;
   PRAGMA EXCEPTION_INIT (non_existent_client, -2291);
BEGIN
   IF (Amount < 0)
   THEN
      RAISE_APPLICATION_ERROR (-20002, 'the amount must be greater than 0');
   ELSE
      INSERT INTO Account (Account_Number,
                           Client_Number,
                           OpeningDate,
                           Balance,
                           PRM)
           VALUES (seqCompte.NEXTVAL,
                   NumCli,
                   TO_DATE (NOW (), 'DD.MM.YY'),
                   Amount,
                   PMVR);
   END IF;
EXCEPTION
   WHEN non_existent_client
   THEN
      DBMS_OUTPUT.PUT_LINE (
         'Client No' || TO_CHAR (NumCli) || ' non-existent');
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (
         'Oracle error:' || SQLCODE || '; Oracle message: ' || SQLERRM);
END;

相关问题