【问题标题】:I have a problem with a procedure in SQL and I dont now what the erros means我对 SQL 中的过程有疑问,我不知道错误是什么意思
【发布时间】:2019-12-14 11:50:28
【问题描述】:

我们有两个表: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 翻译(免费版)

【问题讨论】:

  • 请不要用sql-server标记Oracle特定的问题。
  • 编辑问题并分享表格结构account
  • 您发布的代码(仍然)无法编译,因此我们很难为您提供适当的帮助。 ORA-00984 错误意味着您在 INSERT 语句的 VALUES 子句中有一个值,该值是 ACCOUNT 表的列名。因此,如果该提示不足以让您修复代码,请发布 ACCOUNT 的 DDL。

标签: sql oracle plsql plsql-package


【解决方案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;

【讨论】:

  • 我有一个表 Account 我可以在其中插入值。
  • 所以用你的 CREATE PROCEDURE 替换我的 DECLARE。这或多或少是将匿名 PL/SQL 块转换为过程所需的唯一更改。
  • 无论如何我在第 10 行和第 19 行遇到了同样的错误
  • 我感觉您没有阅读我在上面发布的代码中写的反对意见。
  • 无论如何我在 10/7 PL/SQL: SQL Statement ignore 和 19/20 : PL/SQL: ORA-00984: Column not allowed here 的行中遇到了同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多