Автоинкремент в пакете Oracle - PullRequest
2 голосов
/ 02 июня 2011

Я пытаюсь использовать автоинкремент в моем пакете без использования триггера. Может ли кто-нибудь объяснить мне, как я должен использовать его в моем пакете? Я видел другие вопросы об автоинкременте, но никто не использовал автоматическое увеличение без триггера на пакете

 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; 

Ответы [ 4 ]

6 голосов
/ 02 июня 2011

Вы хотите разрешить передачу пользовательского идентификатора пользователя или всегда использовать последовательность?

В первом случае вам потребуется что-то вроде:

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; 
2 голосов
/ 02 июня 2011

Вы не так далеко от рабочего решения:

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 НАЧАТЬ С 1 УВЕЛИЧЕНИЕМ НА 1).

Поскольку идентификатор пользователя не назначается автоматически, он больше не являетсясписок параметров.

2 голосов
/ 02 июня 2011

Вы хотите что-то вроде

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; 
0 голосов
/ 17 июня 2011

Вместо этого я бы назвал вашу процедуру ФУНКЦИЕЙ и вернул бы новый идентификатор вызывающей стороне:

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;

Как правило, это более полезный шаблон для вставок, особенно если вы хотите впоследствии вставить дочерние записи в другие таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...