2

以下のコード行を記述し、PL/SQL Developer Tool から同じように実行しました。

Oracle 11g データベースに HR スキーマも作成しました。

コード

CREATE TABLE employees2 AS SELECT last_name FROM employees;
<<MAIN>>
DECLARE
last_name VARCHAR2(10) := 'King';
my_last_name VARCHAR2(10) := 'King';
BEGIN

-- Deletes everyone, because both LAST_NAMEs refer to the column
DELETE FROM employees2 WHERE last_name = last_name;
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.');
ROLLBACK;

-- OK, column and variable have different names
DELETE FROM employees2 WHERE last_name = my_last_name;
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.');
ROLLBACK;

-- OK, block name specifies that 2nd LAST_NAME is a variable
DELETE FROM employees2 WHERE last_name = main.last_name;
dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows.');
ROLLBACK;
END;
/
DROP TABLE employees2;

しかし、最初の宣言ステートメントを実行している間、以下のようにエラーがスローされます

ORA-06550: line 4, column 0:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   * & = - + ; < / > at in is mod remainder not rem
   <an exponent (**)> <> or != or ~= >= <= <> and or like like2
   like4 likec between || multiset member submultiset

私はPL/SQLに非常に慣れておらず、現在自己学習しているため、私を導いてください。

4

2 に答える 2

1

これは、PL/SQL Developer レクサーまたはパーサーのバグです。ブロック全体を別の で囲むことで回避できますbegin ... end;


SQL ウィンドウは SQL と PL/SQL の両方で機能しますが、2 つのステートメント タイプの文法は異なります。エディター ウィンドウには完全なパーサーは必要ありません。ただし、あるステートメントがいつ終了し、別のステートメントが開始されるかを知るには、ステートメントについて十分に認識している必要があります。SQL ステートメントを開始する方法は多数ありますが、PL/SQL ブロックを開始する方法はほとんどありません。このコードでは、おそらく次のような分類アルゴリズムが使用されていbeginますend。プログラマーは、PL/SQL をラベルで開始できることをおそらく忘れていました。パーサーはそれが SQL ステートメントであると判断するため、最初のセミコロンで停止します。

エラーと以下の強調表示で、最初のセミコロンに基づいてステートメントが分割されていることがわかります。

ここに画像の説明を入力

Frank Schmitt のアイデアは優れており、通常、この種の問題を回避できます。ただし、この場合、コマンド ウィンドウも式全体を強調表示しても問題は解決しません。

唯一の回避策は、次のようにエクストラbeginendブロックを追加することです。

--Add extra begin/end to work around PL/SQL Developer parser bug.
begin
    <<main>>
    declare
        v_test number := 1;
    begin
        main.v_test := 1;
    end;
end;
/
于 2015-09-26T04:01:52.943 に答える
0

あなたのコードは問題ないので、クライアントの問題だと思います。

PL/SQL Developerにはさまざまな種類のウィンドウがあります。この種類の問合せには、「コマンド・ウィンドウ」(本質的にSQL/Plusプロンプト)を使用する必要があります。

スクリプト全体を実行してもうまくいかない場合は、各ステートメントを個別に実行してみてください (「SQL ウィンドウ」でコード ブロックを選択し、選択した部分のみを実行できます)。

于 2013-03-28T08:25:07.643 に答える