1

基本的に、レコードへの参照を作成したいのですが、一方のレコード タイプは他方のレコード タイプのスーパータイプです。私はそれについて少し混乱しています。

ここに私のタイプがあります:

 CREATE OR REPLACE TYPE  module_t AS OBJECT (
     moduleCode# char(4),
     moduleName char(10)
) NOT FINAL;
/

CREATE OR REPLACE TYPE  specialised_module_t under module_t (
     someSpecialAttribute char(10)
);
/

CREATE OR REPLACE TYPE  course_t AS OBJECT (
     courseCode# char(4),
     module1 REF module_t,
     module2 REF specialised_module_t
);
/

ここに私のテーブルがあります:

CREATE TABLE module_tab OF module_t(
    moduleCode# PRIMARY KEY NOT NULL
);

CREATE TABLE course_tab OF course_t(
    courseCode# PRIMARY KEY NOT NULL,
    scope for (module1) is module_tab,
    scope for (module2) is module_tab
);

標準モジュールで構成されるモジュール テーブルにレコードを挿入します。

insert into module_tab values(
'm001', 'physics'
);

特殊なモジュールで構成されるモジュール テーブルにレコードを挿入します。

insert into module_tab
    values( specialised_module_t(
    'm002',
    'physics',
    'special'
    )
);

ここにトリッキーなビットがあります:

コーステーブルにコースレコードを作成したい。このレコードでは、module1属性はモジュールm001(最初のモジュール レコード)module2を参照する必要があり、属性はモジュールを参照する必要があります。m002

たぶん次のようになると思いました:

INSERT into course_tab VALUES(
       'c001',
        SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm001',
        SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm002'
)

これはうまくいきません:(

エラーメッセージは次のとおりです。

ERROR at line 3:
ORA-00936: missing expression

明らかに私の構文は間違っていますが、それを修正する方法がわかりません:/

私はこれに何年も費やしてきましたが、理解できません:(
助けていただければ幸いです:D
ありがとう

アップデート:

@a_horse_with_no_name の助けを借りて、私の新しいコードは次のとおりです。

INSERT into course_tab VALUES(
       'c001',
        (SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm001'),
        (SELECT treat(REF(c) as ref specialised_module_t) FROM module_tab c WHERE treat(values(c) as moduleCode).person# = 'm002')
);

しかし、今私はエラーが発生します:

ERROR at line 4:
ORA-00936: missing expression

助けてください、ありがとう:)

4

1 に答える 1

0

SELECTステートメントを使用してVALUES句内にスカラー値を挿入する場合は、SELECTステートメントを括弧で囲む必要があります。

INSERT into course_tab 
   (coursecode#, module1, module2)
VALUES 
   (
    'c001',
    (SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm001'),
    (SELECT REF(c) FROM module_tab c WHERE c.moduleCode# = 'm002')
   );

あなたの例で試してみたところ(ちなみに、他にもたくさんの構文エラーがあります)、エラーメッセージが表示されました:

ORA-00932:一貫性のないデータ型:予期されたREFSPECIALISED_MODULE_TがREFMODULE_Tを取得しました[SQLState = 42000、DB Errorcode = 932]

ただし、それをどうすればよいかはわかりません(Oracleオブジェクト型を実際に操作したことはなく、のテーブル定義course_tabはまったく新しいものです。

于 2012-12-04T08:40:27.030 に答える