2017-01-24 13 views
1

私はpl/sqlプログラミングの初心者です。 私は割り当てを持っています: "Brewbean'sはBB_BASKETITEMテーブルのQUANTITYカラムにチェック制約を追加したいと思います。買い物客がアイテムの20より大きい量値を入力すると、Brewbean'sは" Quant Quantity "というメッセージを画面に表示します。テキスト・エディタを使用して、Chapter04フォルダのassignment04-06.txtファイルを開きます。チェック制約を追加するには、最初の文ALTER TABLEを実行する必要があります。次の項目は、これをテストするINSERTアクションを含むPL/SQLブロックですこのブロックにチェック制約違反をトラップしてメッセージを表示するコードを追加してください。inpl/sqlの未定義エラー例外処理

ORA-06550:行5、列1: PLS-00103:発生しましシンボル "ALTER" は、私は、このようなエラーレポートを得たthis-

set serveroutput on; 
declare 
ex_basket exception; 
pragma EXCEPTION_INIT(ex_basket, -02290); 
BEGIN 
ALTER TABLE bb_basketitem 
    ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20); 
    INSERT INTO bb_basketitem 
    VALUES (88,8,10.8,21,16,2,3); 
exception 
when ex_basket then 
DBMS_OUTPUT.PUT_LINE('Check Quantity'); 
END; 

のように、試してみました次 の1を期待:

としながら、ループMODヌルプラグマレイズが選択更新を返す 場合はgotoのためのケースの宣言出口を開始

この安い質問を申し訳ありません。私はこれを助けてくれる人が大好きです。

答えて

1

SQLとPL/SQLは2つの異なる言語であることを理解する必要があります。 ALTER TABLEはSQL文であり、PL/SQLではありません。静的SQL DDL文をPL/SQLブロック内で実行することはできません。ただし、PL/SQLは、提供する多くの機能を使用してSQLに簡単に統合できます。これらの機能の1つはEXECUTE IMMEDIATEです。あなたのコードと非常に。仕あるために

EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);' 
0

はそのため、あなたは夜はこのようなものにするために文をALTER DTO変更を必要としています。以下のコードで問題は解決します。

SET serveroutput ON; 
DECLARE 
    ex_basket EXCEPTION; 
    pragma EXCEPTION_INIT(ex_basket, -02290); 
BEGIN 
    EXECUTE IMMEDIATE 'ALTER TABLE bb_basketitem ADD CONSTRAINT bitems_qty_ck CHECK (quantity < 20);'; 
    INSERT INTO testab VALUES 
    (88 
    ); 
EXCEPTION 
WHEN ex_basket THEN 
    dbms_output.put_line('Check Quantity'); 
END; 
0

例外処理に関して、これは実行時に起こるものです。しかし、あなたのコードにALTERのような認識できないキーワードがある場合、最初の場所でコンパイルされないので、まったく実行されません。代わりに、ブロック全体が無効として拒否されます。

dbms_outputまた、出力バッファにデバッグメッセージを入れ、ブロックが正常に完了できるように、一般的には例外処理には適していません。何かが間違っていた。 raise or raise_application_errorの使用を検討することもできます。