2016-08-04 17 views
0

Ich möchte eine Prozedur erstellen, um Werte in eine Tabelle einzufügen. Meine Tabelle hat Standardwerte für bestimmte Felder. Ich möchte die gleichen Standardeinstellungen in meiner Prozedur verwenden, ohne sie manuell in meine Prozedur eingeben zu müssen. zBPLSQL mit Tabelle Standardwert in Prozedur Standardparameter beim Einfügen

create table products 
(
    prod_id number primary key, 
    stock number default 0 
); 

Mein Verfahren Erklärung:

create procedure insert_product 
(
    prod_id number, 
    stock number default products.stock.default 
); 

Aber ich bekomme:

Fehler (58,99): PLS-00103: Fand das Symbol "STANDARD", wenn ein erwartet der folgenden: aktuelle Löschung existiert vor Das Symbol "wurde vor" DEFAULT "eingefügt, um fortzufahren.

Ich habe versucht:

stock number default); 

stock number default products.stock); 

Aber sie geben auch Fehler. Kann auf den Standardwert der Tabelle von der Prozedur zugegriffen werden, ohne sie explizit in die Prozedur einzutippen? Ich weiß

stock number default 0); funktioniert gut.

Ich bin neu in PLSQL, also vergib mir, wenn es eine dumme Frage ist.

+0

Damit eine Variable den gleichen Datentyp wie die Spalte einer Tabelle hat, deklarieren Sie zunächst Folgendes: 'var_name table.column_name% type'. Zweitens kann die PL/SQL-Variable den Standardwert einer Tabellenspalte nicht erben. Damit eine Spalte beim Einfügen einen Standardwert erhält, können Sie sie entweder weglassen oder das Schlüsselwort 'default' in der Klausel' values ​​() 'Ihrer' insert in' -Anweisung verwenden. –

+0

@ NicholasKrasnov Danke. Ich habe Best Practices wie stock products.stock% type verwendet, meine Einschränkungen benannt und bei Bedarf Spaltennamen hinzugefügt. Ich habe sie hier weggelassen, um Unordnung zu beseitigen. Daher können Standardwerte nicht vererbt werden. OK. – uutsav

Antwort

0

Sie können eine private Prozedur innerhalb Ihrer Hauptprozedur durchführen und dies erreichen. Bitte überprüfen Sie die folgenden Punkte: Bitte beachten Sie, dass der Code nur ein Beispiel ist und nicht getestet wurde.

create or replace procedure abc 
as 
v_num number; 
--Private Proc to Main procedure abc 
Procedure insert_product (prod_id number, 
          stock number) 
Is 
begin 
    <you logic>; 

end; 

Begin 

    select stock 
    into v_num 
    from products 
    where <condition>; 

    insert_product(PROD_ID,v_num); 

End ; 
+0

Wie ich verstehe, sollte ich überprüfen, ob der Wert für den Bestand im äußeren Verfahren zur Verfügung gestellt wird. Ist dies nicht der Fall, rufen Sie die Tabellenstandardwerte ab und speichern Sie sie in v_num. Rufen Sie dann die verschachtelte Prozedur auf, um die tatsächliche Einfügung in die Tabelle durchzuführen. Ich habe 2 Probleme: 1) wieder, wie man den Standardfeldwert der Tabelle erhält 2) Es ist übermäßig komplizierter Weg für solch eine einfache Aufgabe. Können wir das einfacher machen? – uutsav

+0

Es besteht keine Notwendigkeit, dies zu überprüfen, da dies den Zweck der Zuweisung eines Standardwerts zunichtemacht. Wenn Sie nach dem Erstellen einer Tabelle mit dem Standardspaltenwert in diese Spalte nichts eingefügt haben, wird der Standardwert automatisch ausgefüllt. In dem obigen Beispiel und einfach den Wert des Bestands in meinem Hauptproc auswählen, der sowieso Standardwert sein wird, wenn nichts eingefügt wird, und es dann an meine Prozedur übergeben. – XING