将值插入列而不通过参数传递?

Inserting Values Into A Column Without Passing It Through a Parameter?

我有一个名为 Users 的 table,只有 2 列 id(类型 NUMBER)和 Name(类型 VARCHAR2).所有列都不可为空

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

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

程序编译 BUT,错误如下:错误 ORA-00947:值不足。

当我运行它如下:

  BEGIN
       insert_new_user ('Bob');
  END
  /

它抛出 PL/SQL 编译错误。

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

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

id Name

1 Adam

2 Ben

3 Bob

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

看起来您正在尝试做的是在 TABLE 上设置标识列(每条记录自动递增),所以您不会必须对存储过程进行任何更改。

answer 似乎可以解决该问题。

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

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

在 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;
/

注意:请参阅 了解为什么您通常不应在程序中使用 COMMIT 而应该在用户的交易中使用 COMMIT