将值插入列而不通过参数传递?
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
。
我有一个名为 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
。