Oracle 包中的自动增量

Posted

技术标签:

【中文标题】Oracle 包中的自动增量【英文标题】:Auto increment in Oracle package 【发布时间】:2011-09-07 06:05:19 【问题描述】:

我试图在我的包上使用自动增量而不使用触发器。有人可以解释我如何在我的包中使用它。我这样做并没有工作它抱怨的 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; 

【问题讨论】:

【参考方案1】:

我会将您的过程表述为 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;

这通常是一种更有用的插入模式,尤其是在您可能希望随后在其他表中插入子记录的情况下。

【讨论】:

【参考方案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_idnameage。此外,我假设您已经创建了一个名为 seq_user_id 的序列(CREATE SEQUENCE seq_user_id START WITH 1 INCREMENT BY 1)。

由于用户ID不是自动分配的,它不再是参数列表的一部分。

【讨论】:

【参考方案3】:

你想要类似的东西

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; 

【讨论】:

【参考方案4】:

您是要允许传入自定义 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; 

【讨论】:

以上是关于Oracle 包中的自动增量的主要内容,如果未能解决你的问题,请参考以下文章

向oracle中的现有表添加自动增量主键[重复]

oracle DB 中的自动增量替代方案

如何在 Oracle 11g 中创建自动增量?

Oracle自动增量[重复]

Oracle 的自动增量

在 Oracle 中定义自动增量时插入触发器的行为