我有一个名为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
表的新用户行,而3
是id
列中自动添加的数字。
答案 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
。