2011-06-02 49 views
2

我想在我的包中使用自動增量而不使用觸發器..有人可以解釋我如何在我的包中使用它..我這樣做並沒有工作它抱怨的abt變量沒有被聲明或類型未分配..我看到其他自動增量的問題,但沒有人使用自動增加而沒有觸發軟件包在Oracle包中自動增量

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; 

回答

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; 
+0

擊敗我30秒! – 2011-06-02 17:36:25

+0

@Justin - 這就是你得到的格式化你的代碼! :) – Craig 2011-06-02 17:37:21

+0

謝謝..它的工作 – jack 2011-06-02 17:54:31

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

你不是遠離工作解決方案:

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未自動分配,因此不再是參數列表的一部分。

0

我會詞組你的程序作爲一個函數來代替,並返回新的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; 

這通常是插入一個更有用的模式,尤其是在您可能希望隨後插入子記錄在其他表格中。