4

私はこれを前に見たことがありません...次のように始まるクエリがあります:

with q1 as
     (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567')
select case
           when ... /* rest of query omitted */

これを実行しようとすると、Oracle はtable or view does not exist. ただし、実際のテーブル/ビュー名ではなく、3 行目 の「,」が強調表示されます。

               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_VAL,
                                                                  *
3 行目のエラー:
ORA-00942: 表またはビューが存在しません

省略したクエリの残りの部分はかなり長くて複雑です。必要に応じてサニタイズして投稿します。今のところ、このエラーは を参照する 3 番目のサブクエリを追加したときにのみ発生したとだけ言っておきますq1。実際、3 つのサブクエリのいずれかを削除すると、すべてが実行されるように見えますが (結果は正しくありません)、純粋な SQL エラーではなく、ある種の Oracle エラーに遭遇したように感じます。q1の本体をスタンドアロンのクエリとして実行できることも興味深いです。それを実行しても問題はありません。クエリ全体を実行した場合にのみ、大文字と小文字の後のコンマについて文句を言いますq1

誰もこれを経験したことがありますか?

(Oracle 10g を使用)。


編集:ASキーワードを追加してみました。結果は次のとおりです。

               case when a.perc_fault > 0 THEN 'Y' ELSE 'N' end AS L_VAL, a.C_VAL
                                                                     *
3 行目のエラー:
ORA-00942: 表またはビューが存在しません

アスタリスクが同じ位置にあるように見えますが、単語が 3 文字ずれているVため、 の下にあります。L_VAL非常に奇妙な...

4

2 に答える 2

0

私が Oracle のバグ 5130732 を経験しているかどうかはわかりませんが、確かにそのように感じます。とにかく、次のようにクエリを書き直しました。

select case ... 
from
    (select ...
     from (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567') q1,  <other tables>
    where ...) subquery1,
    (select ...
     from (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567') q1,  <other tables>
    where ...) subquery2,
    (select ...
     from (select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567') q1,  <other tables>
    where ...) subquery3, <other tables>
where....

q1はい、それを使用したすべてのサブクエリにのコピーを含めましたが、現在はすべて正常に動作しています。実際のビューも機能しますが、これは簡単でした (政治的に、つまり、分析を実行する必要がある環境へのコード プロモーションの要求がなく、データベースに後で追加されたオブジェクトに関する会議もありません...)。


アップデート

そして、クエリを PL/SQL スクリプトに追加したので、Oracle はORA-00600 [qcscpqbTxt], [600]、Oracle のバグ #5765958 に関連しているように思われる .... * ため息 *... 回避策を提案できる人はいますか? 私はメタリンクへのアクセス権を持っていません (まあ、DBA を通じてアクセスするかもしれませんが、これがどうにかして彼らのレーダーを捉えることができるのであれば)。

于 2011-04-12T20:37:01.840 に答える
0

Oracle のバグに遭遇し、データベースにパッチを当てることができないと仮定すると、サブクエリを関数に移動してみることができます。これが機能するかどうかは完全にはわかりません.PL / SQLバージョンがパッケージに含まれているか、関数を追加できるバージョンがあると想定しています:

パッケージ仕様:

type q1_rec is record(
    d_id ab_a_table.v_id%TYPE,
    v_id ab_a_table.d_id%TYPE,
    c_id ab_a_table.c_id%TYPE,
    l_val char(1),
    c_val ab_a_table.c_val%TYPE);
type q1_arr is varray(9999); -- assuming you can pick a max size
function q1 return q1_arr pipelined;
pragma restrict_references(q1, wnds);

パッケージ本体:

function q1 return q1_arr pipelined is
    cursor c is
        select a.V_ID, a.D_ID, a.C_ID,
               case when a.percent > 0 THEN 'Y' ELSE 'N' end L_val,
               a.C_val
       from ab_a_table a
       where a.C_ID =  '00000003' -- '00000007' --  test values
             and a.B_VAL = '6010001'
             and a.Q = '11234567');
begin
    for r in c loop
        pipe row(r);
    end loop;
end;

次に、メイン クエリでサブクエリを に置き換えますtable(q1())

参照カーソルまたはネストされたテーブルを使用すると、少しすっきりするかもしれませんが、パッケージの外部で構築されたテーブル型が必要になります。これは、ビューの使用に関する余分なオブジェクトのコメントに基づいて避けたいと思います。

于 2011-04-13T09:13:47.387 に答える