2017-04-21 52 views
0

我有一個只有2列id(在NUMBER類型)和Name(在類型VARCHAR2)名爲Users表。所有列不可爲空將值插入列而不通過參數傳遞它?

我創建了一個SQL過程只需要一個參數(新用戶名)如下:

CREATE OR REPLACE PROCEDURE insert_new_user 
    (
     this_name VARCHAR2; 
) 
    AS 
    BEGIN 
     INSERT INTO Users 
     VALUES (this_name); 
     COMMIT; 
    END; 
/

程序編譯,但有錯誤如下:錯誤ORA-00947:不足夠的價值。

當我運行它,如下所示:

BEGIN 
     insert_new_user ('Bob'); 
    END 
/

它拋出一個PL/SQL編譯錯誤。

如何設置id列自動放入下一個數字而不需要通過參數傳遞?

理想的輸出將是一個場景,如:

ID名稱

1亞當

2本

3鮑勃

哪裏Bob是新的用戶行插入到user表和3是在id列中自動添加的數字。

+0

Id列是標識列嗎? –

+0

是的,這是PK – 5120bee

+0

主鍵和身份不一樣。標識列值是自動增量的。在你的情況下,如果id列是主鍵但不是自動增量,那麼當你在表中插入行時,你必須爲它提供一個值。來自@Dan的回答應該提供更多關於自動增量列的細節。 –

回答

1

在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; 
/

注:參見this discussion關於爲什麼你不應該在程序中使用COMMIT,而應該在用戶的交易中使用COMMIT

+0

謝謝。這符合我最想找的東西。 – 5120bee

3

看起來你要做的是在表上設置一個標識列(對每條記錄自動遞增),所以你不必對存儲過程做任何改變。

這個answer似乎解決了這個問題。

基本上,你只需要運行(如果你的Oracle版本支持):

CREATE TABLE t1 (
    c1 NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1), 
    c2 VARCHAR2(10) 
);