【问题标题】:Inserting Values Into A Column Without Passing It Through a Parameter?将值插入列而不通过参数传递?
【发布时间】:2017-09-17 19:41:42
【问题描述】:

我有一个名为Users 的表,其中只有两列idNUMBER 类型)和NameVARCHAR2 类型)。所有列都不可为空

我创建了一个只接受一个参数(新用户名)的 SQL 过程,如下所示:

  CREATE OR REPLACE PROCEDURE insert_new_user
  (
        this_name VARCHAR2;
  )
  AS
  BEGIN
        INSERT INTO Users
        VALUES (this_name);
        COMMIT;
  END;
  /

该过程编译但出现以下错误:错误 ORA-00947:没有足够的值。

当我按如下方式运行它时:

  BEGIN
       insert_new_user ('Bob');
  END
  /

它会引发 PL/SQL 编译错误。

如何设置id列自动输入下一个数字而不需要通过参数传递?

理想的输出是这样的场景:

身份证名称

1 亚当

2本

3 鲍勃

其中Bob 是插入到user 表中的新用户行,3 是自动添加到id 列中的数字。

【问题讨论】:

  • Id 列是标识列?
  • 对,就是PK
  • 主键和身份不一样。标识列值是自动递增的。在您的情况下,如果 id 列是主键但不是自动增量,那么在表中插入行时您必须为其提供一个值。下面@Dan 的回答应该提供有关自动增量列的更多详细信息。

标签: sql oracle plsql parameter-passing procedure


【解决方案1】:

看起来您正在尝试在表上设置一个标识列(每条记录自动递增),因此您不必对存储过程进行任何更改.

这个answer 似乎解决了这个问题。

基本上,你只需要运行(如果你的 Oracle 版本支持的话):

CREATE TABLE t1 (
    c1 NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), 
    c2 VARCHAR2(10)
);

【讨论】:

    【解决方案2】:

    在 Oracle 11 及更早版本中,使用序列:

    CREATE SEQUENCE Users__ID__Seq;
    /
    
    CREATE OR REPLACE PROCEDURE insert_new_user
    (
      this_name USERS.NAME%TYPE
    )
    AS
    BEGIN
      INSERT INTO Users ( id, name )
      VALUES ( Users__ID__Seq.NEXTVAL, this_name );
    END;
    /
    

    注意:请参阅this discussion,了解为什么通常不应在过程中使用COMMIT,而应在用户事务中使用COMMIT

    【讨论】:

    • 谢谢。这符合我最想要的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多