0

我们有两个表:Account 和 Client

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 in number, Amount in number)

此过程为具有第一个余额(金额)的客户 (NumCli) 创建一个新帐户:

  • 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 语句
10/81 PL/SQL:ORA-00984:此处不允许列

使用 www.DeepL.com/Translator 翻译(免费版)

4

1 回答 1

1

一些反对意见:

  • 这似乎不是整个代码。什么应该引发non_existent_client异常?
  • 您插入的值来自哪里?
  • 功能是什么new?在 Oracle 中,我们使用sysdate
  • 你确实喜欢管道,这很明显,但是 - 不要过多使用它们(提示:它们在dbms_output通话中的用法)
  • 命名表列时不允许使用空格(insert语句)
  • 减号不应用作单词分隔符(exception名称)
  • when others没用;我建议你删除它。或者,如果你坚持,raise紧接着dbms_output

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

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;
于 2019-12-14T11:57:40.883 回答