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

时间:2017-04-21 00:18:42

标签: sql oracle plsql parameter-passing procedure

我有一个名为Users的表,只有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姓名

     

1 Adam

     

2本

     

3 Bob

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

2 个答案:

答案 0 :(得分:3)

看起来你要做的是在TABLE 上设置一个标识列(每个记录自动递增),这样你就不必对存储过程进行任何更改

answer似乎可以解决该问题。

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

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

答案 1 :(得分:1)

在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