1

PL / SQLは初めてですが、Oracleでカスタム表タイプを使用してビューを作成する際に問題が発生します。作成されるタイプは次のとおりです。

create or replace
TYPE "Control" AS OBJECT ("Date" nvarchar2(10), "R" number(7,3), "Limit(7,3);
create or replace TYPE Controls AS TABLE OF "Control";

CREATE OR REPLACE TYPE Result_typ AUTHID CURRENT_USER AS OBJECT (
  "Program" varchar(10),
  "ID_User" nvarchar2(25),
  "Controls" Controls,
 )

DBには、2つの異なるタイプのコントロール(c_control、g_control)が、いくつかの共通フィールドを持つ異なるテーブルに格納されています。タイプに関係なく、すべての異なるコントロールを選択するビューを作成しようとしているので、UNION句を使用します。ここに私のビュー作成ステートメントがあります(より簡単にするためにいくつかの微妙な変更があります):

CREATE OR REPLACE VIEW "all_controls" OF Result_typ 
with object IDENTIFIER ("ID_User") 
as SELECT 'MYAPP' as Program, 
u.user_id as "ID_User", 
CAST(MULTISET(
     select to_char(control_date,'yyyy-mm-dd') as "Date", 
  r as "R", 
     limit as "Limit"
     from g_control
     where control_date between to_date('20130310','yyyymmdd') 
     and to_date('20130313','yyyymmdd')
  UNION
     select to_char(control_date,'yyyy-mm-dd') as "Date", 
 r as "R", 
 limit as "Limit",
 from control
 where and control_date between to_date('20130310','yyyymmdd') 
     and to_date('20130313','yyyymmdd')
) AS Controls) 
FROM user u
WHERE u.user_name like 'Scott';

SQL Developerからステートメントを実行すると、戻り値は「SQLエラー:ソケットから読み取るデータがありません」です。MULTISET内でUNIONを実行するのに問題はありますか?UNIONの結果をMULTISETとして選択するにはどうすればよいですか?前もって感謝します

4

1 に答える 1

3
SELECT
    CAST(MULTISET(
            select '2013-01-01' a, 1 b, 1 c from dual union all
            select '2013-01-01', 1, 1 from dual
    ) AS Controls) 
FROM dual;

ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 7292
Session ID: 201 Serial number: 4479

追加のインラインビューを追加すると、それが修正されるようです:

SELECT
    CAST(MULTISET(
        select * from
        (
            select '2013-01-01' a, 1 b, 1 c from dual union all
            select '2013-01-01', 1, 1 from dual
        )
    ) AS Controls) 
FROM dual;

CONTROLS(Control('2013-01-01', 1, 1), Control('2013-01-01', 1, 1))

( OracleフォーラムのMichaelSに感謝)

その他のアドバイス:

  1. 引用符で囲まれた識別子は避けてください。オブジェクトが使いにくくなります。
  2. 日付を文字列として保存しないでください。 特にオブジェクト型を使用している場合。文字列型のオブジェクト リレーショナル データは奇妙です。
  3. 関数がない場合、AUTHID CURRENT_USER は役に立ちません。
  4. より良いインデントは、問題をより簡単に理解するのに役立ちます
  5. 常に完全なエラー メッセージを含める
  6. 完全なスキーマ定義が役に立ちました。
  7. あなたの例には多くの構文エラーがあります。
  8. @APC が述べたように、Oracle のオブジェクト リレーショナル機能は非常に困難です。可能であれば、使用を再検討する必要があります。最初は、通常のリレーショナル テクノロジに集中する必要があります。
  9. ここにはまだいくつかのバグがあります。アラート ログを確認すると、次のような内容が表示されますORA-07445: exception encountered: core dump [qcsfsqacn()+105] [ACCESS_VIOLATION] [ADDR:0x4] [PC:0x12286C1] [UNABLE_TO_READ] []。この回避策で十分でない場合は、このバグについて Oracle サポートに連絡する必要があります。My Oracle Support で確認しましたが、現在、このエラーに関するドキュメントはありません。
于 2013-03-12T18:29:50.557 に答える