5

このチュートリアルに基づいて自動インクリメント主キーベースでテーブルを作成しようとして、人生の過去 2 時間を無駄にしました。これは、タイムスタンプと、同じテーブル内のタイムスタンプと呼ばれるテーブルです...

テーブルを作成するときに、オラクルがこれを問題としてフラグ付けしないのはなぜですか?

入力するコマンドのシーケンスは次のとおりです。

  1. テーブルの作成:

    CREATE TABLE myTable
       (id NUMBER PRIMARY KEY,
        field1 TIMESTAMP(6),
        timeStamp NUMBER,
    );
    
  2. シーケンスの作成:

    CREATE SEQUENCE test_sequence
    START WITH 1
    INCREMENT BY 1;
    
  3. トリガーの作成:

    CREATE OR REPLACE TRIGGER test_trigger  
    BEFORE INSERT  
    ON myTable  
    REFERENCING NEW AS NEW  
    FOR EACH ROW  
    BEGIN  
    SELECT test_sequence.nextval INTO :NEW.ID FROM dual;  
    END;  
    /
    

これが私が得るエラーメッセージです:

ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed

「timestamp」という単語が含まれる 2 行を含まない組み合わせは問題なく動作します。キーワードと列名を区別するには構文で十分だと思っていたでしょう。

私が言ったように、テーブルが正常に作成される理由がわかりませんが、トリガーを作成しようとするとオラクルが失敗します...

明確化

問題は、キーワードである場合とそうでない場合があるタイムスタンプという列があることです。私の問題は、テーブルを作成したときではなく、トリガーを作成しようとしたときにバーフが発生した理由です。少なくとも警告が表示されると予想していました。

とは言っても、Oracle を数時間使用したことで、エラー レポートの詳細度が大幅に低下したように見えます。

これが Oracle のバグである場合、サポート契約を結んでいない人はどのように報告するのでしょうか? 一部のコードをMySQLからOracleに移行する必要があるため、エクスプレスバージョンで遊んでいます。

4

6 に答える 6

9

この (227615.1) 抽出に関するメタリンクに関するメモが以下にあります。

# symptom: Creating Trigger fails
# symptom: Compiling a procedure fails
# symptom: ORA-06552: PL/SQL: %s
# symptom: ORA-06553: PLS-%s: %s     
# symptom: PLS-320: the declaration of the type of this expression is incomplete or malformed
    # cause: One of the tables being references was created with a column name that is one of the datatypes (reserved key word). Even though the field is not referenced in the PL/SQL SQL statements, this error will still be produced.

    fix:

    Workaround:

    1. Rename the column to a non-reserved word.
    2. Create a view and alias the column to a different name.
于 2008-11-13T14:12:07.920 に答える
3

TIMESTAMPは、予約語としてOracleドキュメントにリストされていません(これは驚くべきことです)。

V $ RESERVED_WORDSデータディクショナリビューにリストされていますが、RESERVEDフラグは「N」に設定されています。

トリガー処理のバグである可能性があります。これはOracleサポートにとって良いものだと思います。

于 2008-11-12T20:58:43.300 に答える
1

あなたは自分で答えをほのめかしました。列名として使用timestampしていますが、キーワードでもあります。列名を別のもの (例: xtimestamp) に変更すると、トリガーがコンパイルされます。

于 2008-11-12T17:42:12.027 に答える
0

Oracleにビューを維持させる代わりに、EXECUTE IMMEDIATEを使用します(つまり、「列の名前を予約されていない単語に変更する」がオプションではない場合。

于 2011-03-16T19:14:19.900 に答える
0

EXECUTE IMMEDIATE で実行できます。ITはより良い方法ではありませんが、うまくいき、列の名前変更を避けます。

私の場合、列の名前を変更するのは無秩序な方法です

于 2016-01-14T19:51:27.010 に答える
0

よくわかりませんが、これは、データベース オブジェクトの操作とアクセスに使用される SQL コードが、PL/SQL コードの解釈に使用されるものとは異なる形式のインタープリターによって解釈されるために発生すると考えられます。

SQL と PL/SQL は異なるものであり、処理方法も異なることに注意してください。したがって、1 つのインタープリターに何らかのエラーがあると思いますが、どれがどれであるかはわかりません。

于 2008-11-12T17:36:41.117 に答える