我试图在我的包装上使用自动增量而不使用触发器。有人可以解释我如何在我的包中使用它..我这样做没有工作它的抱怨abt变量未被声明或类型未分配。我看到了其他自动增量问题,但没有人在包装上没有触发器时使用自动增量
PROCEDURE insertExample (
user_id_in IN sample.seq_user_id.nextval,
name_in IN sample.name%TYPE,
age_in IN sample.age%TYPE )
IS
BEGIN
INSERT INTO sample
(seq_user_id.nextval, name, age)
VALUES
(user_id_in, name_in, age_in);
END insertExample;
答案 0 :(得分:6)
您是否希望允许传入自定义user_id或始终使用序列?
在第一种情况下,您需要以下内容:
CREATE OR REPLACE PROCEDURE insertexample (
user_id_in in sample.user_id%type,
name_in in sample.name%type,
age_in in sample.age%type
)
IS
BEGIN
insert into sample
(user_id, name, age
)
values (nvl(user_id_in, seq_user_id.nextval), name_in, age_in);
END insertexample;
如果您总是想使用序列(可能是正确的选择),只需取出输入参数和NVL:
CREATE OR REPLACE PROCEDURE insertexample (
name_in in sample.name%type,
age_in in sample.age%type
)
IS
BEGIN
insert into sample
(user_id, name, age
)
values (seq_user_id.nextval, name_in, age_in);
END insertexample;
答案 1 :(得分:2)
你想要像
这样的东西PROCEDURE insertExample (
name_in IN sample.name%TYPE,
age_in IN sample.age%TYPE )
IS
BEGIN
INSERT INTO sample
(user_id, name, age)
VALUES
(seq_user_id.nextval, name_in, age_in);
END insertExample;
答案 2 :(得分:2)
你离工作解决方案不远:
PROCEDURE insertExample (
name_in IN sample.name%TYPE,
age_in IN sample.age%TYPE )
IS
BEGIN
INSERT INTO sample (user_id, name, age)
VALUES (seq_user_id.nextval, name_in, age_in);
END insertExample;
我假设该表至少有三列名为user_id
,name
和age
。此外,我假设您已经创建了一个名为seq_user_id
的序列(CREATE SEQUENCE seq_user_id START WITH 1 INCREMENT BY 1)。
由于未自动分配用户ID,因此它不再是参数列表的一部分。
答案 3 :(得分:0)
我会将您的过程改为FUNCTION,并将新ID返回给调用者:
FUNCTION insert_user
(
name_in IN users.name%TYPE,
age_in IN users.age%TYPE
)
RETURN users.id%TYPE
IS
v_id users.id%TYPE;
BEGIN
INSERT INTO users (
user_id,
name,
age
) VALUES (
seq_user_id.nextval,
name_in,
age_in
)
RETURNING
user_id
INTO
v_id
;
RETURN v_id;
END insert_user;
这通常是一种更有用的插入模式,特别是在您可能希望随后在其他表中插入子记录的情况下。