2017-01-16 162 views
-1

私は、次のエラーを取得しています:01735. 00000 - "無効なALTER TABLEオプション"

  1. 00000 - "missing right parenthesis"

私は私の手順を実行したとき:

CREATE OR REPLACE PROCEDURE ALTER_TABLE_COLUMN_NOT_NULL(
    var_tabname IN VARCHAR2, 
    var_clname IN VARCHAR2, 
    var_defvalue IN VARCHAR2) 
IS 
    l_isnull VARCHAR2(1); 
BEGIN 
    SELECT isnull INTO l_isnull FROM USER_TAB_COLUMNS 
    WHERE TABLE_NAME = var_tabname AND COLUMN_NAME = var_clname; 

    IF l_isnull = 'Y' THEN 
    EXECUTE IMMEDIATE 'ALTER TABLE ' || var_tabname || 
      ' MODIFY COLUMN (' || var_clname || 
      ' DEFAULT ' || var_defvalue || ' NOT NULL)'; 
    END IF; 
END; 

私はエラーに応じていることを知っている、右をカッコがありません。私はそれを書き直す方法はたくさんありましたが、それを修正することはできません。

私は次のように私の手順を実行しています:コンパイルエラーは、実行時エラーになるため、動的SQLを書く

BEGIN 
    ALTER_TABLE_COLUMN_NOT_NULL('FIRSTNAME', 'PRICE', '-'); 
    END; 
+0

書か 'var_tabname'、の値を行いますことを確認するためにクエリを印刷' var_clname'または 'var_defvalue'は、彼らはいけないものが含まれていますか? – JonK

+0

私は私の質問を編集しました、多分私は間違った方法で手続きを呼び出していますか? – NoName123

+0

あなたのコードが 'MODIFY_COLUMN_NOT_NULL'という名前のプロシージャを呼び出そうとしているときに、なぜあなたは' ALTER_TABLE_COLUMN_NOT_NULL'という名前のプロシージャを表示しますか? – Andreas

答えて

1

は、難しいです。

この場合、問題はMODIFY COLUMNの構文が間違っていると思います。それはちょうどMODIFYです。

また、デフォルトの'-'でいくつかの問題が発生することがあります。 priceが数字の場合は、-が無効な番号であるため失敗します。 priceが文字列の場合、渡された値を別の引用符でエスケープする必要があります。

しかし、おそらくあなたはこの一般的なものを作りたいと思うでしょうから、ターゲット列のデータ型をテストし、デフォルト値を適切にフォーマットする、より洗練された処理を書く必要があります。


"Can u give me a hint or any link how one can determine the datatype of a passed value in plsql?"

それが変更された列のデータ型ですが、重要渡された値ではありません。すでに照会しているUSER_TAB_COLUMNSビューから取得できます。

+0

plsqlで渡された値のデータ型を判別する方法をヒントまたはリンクで教えてください。 – NoName123

0

それは正しく

DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || var_tabname || ' MODIFY COLUMN (' || var_clname || ' DEFAULT ' || var_defvalue || ' NOT NULL)'); 
関連する問題