2016-08-04 7 views
0

テーブルに値を挿入するプロシージャを作成したいとします。私のテーブルには、特定のフィールドのデフォルト値があります。手動で手作業で入力することなく、私の手続きで同じデフォルトをしたい。例えば挿入時にプロシージャのデフォルトパラメータでテーブルの既定値を使用するPLSQL

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

マイプロシージャ宣言:

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

しかし、私は得る:

エラー(58,99):PLS-00103:発生しましシンボル "DEFAULT" 一つを期待するとき以前の現在の削除が存在します。続行するには、 "DEFAULT"の前に記号 "を挿入しました。

私が試した:

stock number default); 

stock number default products.stock); 

をしかし、彼らはあまりにもエラーを与えます。プロシージャで明示的に入力せずに、プロシージャによって表のデフォルト値にアクセスできますか?私は知っている

stock number default 0);うまくいきます。

私はPLSQLの初心者ですので、愚かな質問の場合は私を許してください。

+0

まず、変数がテーブルの列と同じデータ型であるためには、次のように宣言します。 'var_name table.column_name%type'。第2に、PL/SQL変数は表の列のデフォルト値を継承できません。挿入時にカラムをデフォルト値にするためには、 'insert into'文の' values() '節に' default'キーワードを使用するか、省略してください。 –

+0

@NicholasKrasnovありがとうございます。私はストックプロダクトのようなベストプラクティスを使用していました.stock%type、制約の名前を付けたり、必要に応じてカラム名にコメントを追加したりしていました。私はここでそれらを取り除き、混乱を取り除いた。したがって、デフォルトは継承できません。 OK。 – uutsav

答えて

0

メインプロシージャ内のプライベートプロシージャを使用してこれを実現できます。以下を確認してください:コードは単なる例であり、テストされていないことをご確認ください。

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

私が理解しているように、外注手続きで在庫が提供されているかどうかを確認する必要があります。そうでなければ、テーブルのデフォルトを取得してv_numに格納します。ネストされたプロシージャを呼び出すと、実際にテーブルに挿入されます。私は2つの問題があります:1)再び、テーブルのデフォルトのフィールド値を取得する方法2)これは単純なタスクのために過度に複雑な方法です。私たちはもっと簡単な方法でそれをやり遂げることができますか? – uutsav

+0

デフォルト値を割り当てる目的を無効にするので、チェックする必要はありません。デフォルト列の値を持つ表を作成した後、その列に何も挿入されていない場合、デフォルト値が自動的に設定されます。上記の例では、単純に私のメインprocの在庫の値を選択します。これは、何も挿入されていない場合のデフォルト値になり、それを私の手続きに渡します。 – XING

関連する問題