2017-04-21 1 views
0

Ich habe eine Tabelle mit dem Namen Users mit nur 2 Spalten id (in Typ NUMBER) und Name (in Typ VARCHAR2). Alle Spalten sind nicht-nullableEinfügen von Werten in eine Spalte, ohne sie durch einen Parameter zu übergeben?

ich eine SQL-Prozedur erstellt nur in einem Parameter (neue Benutzername) zu nehmen, wie folgt:

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

Das Verfahren stellt aber mit Fehlern wie folgt: Fehler ORA-00947: nicht genug Werte.

Wenn ich führen Sie es wie folgt:

BEGIN 
     insert_new_user ('Bob'); 
    END 
/

Es wirft ein PL/SQL-Kompilierung-Fehler.

Wie stelle ich die Spalte id so ein, dass automatisch die nächste Nummer eingegeben wird, ohne dass sie durch einen Parameter übergeben werden muss?

2 Ben

3 Bob

Wo Bob die neue

ID Name

1 Adam ist:

Der ideale Ausgangs wäre ein Szenario wie sein Benutzerzeile eingefügt in die user Tabelle und 3 ist die Nummer automatisch in der id Spalte hinzugefügt.

+0

ID-Spalte ist eine Identitätsspalte? –

+0

Ja, es ist die PK – 5120bee

+0

Primärschlüssel und Identität sind nicht gleich. Identitätsspaltenwerte sind automatisch inkrementell. In Ihrem Fall, wenn die ID-Spalte der Primärschlüssel ist, aber nicht automatisch inkrementell, müssen Sie einen Wert dafür angeben, wenn Sie eine Zeile in die Tabelle einfügen. Antwort von @Dan unten sollte mehr Details über die automatische inkrementelle Spalte geben. –

Antwort

1

In Oracle 11 und früher, verwenden Sie eine Sequenz:

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

Hinweis: siehe this discussion Warum sollten Sie nicht generell COMMIT in Prozeduren verwenden, sondern stattdessen COMMIT in der Transaktion des Benutzers.

+0

Danke. das passt, wonach ich am meisten gesucht habe. – 5120bee

3

Es sieht so aus, als ob Sie eine ID-Spalte (die automatisch für jeden Datensatz erhöht) auf der Tabelle festlegen, so dass Sie keine Änderungen an der gespeicherten Prozedur vornehmen müssen.

Diese answer scheint dieses Problem zu beheben.

Grundsätzlich müssen Sie nur laufen (wenn Ihre Version von Oracle unterstützt):

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