我在SQL中的过程有问题,现在我不明白错误提示的含义

时间:2019-12-14 11:50:28

标签: sql plsql plsqldeveloper plsql-package

我们有两个表: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,数量为

此过程为客户(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(免费版)翻译

1 个答案:

答案 0 :(得分: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;