2016-09-16 4 views
15

それは少しおかしいが、Oracle 11gは本当に、そのようなクエリがWITH句で同じalias_nameを持つ複数のサブクエリを使用できるのはなぜですか?

with 
    a as (select 1 from dual), 
    a as (select 2 from dual) 
select * 
from a; 

を実行することができますこれは、最初のサブクエリ(すなわち、1)の結果を返します。

このような機能が役立つ可能性がある状況を想像することはできません。私の場合は、コピー/貼り付け後にサブクエリの名前を変更するのを忘れてしまい、全体的なクエリが間違った/予期しない結果を返すという問題が発生しました。幸いにも、クエリは非常に簡単で、理由はすぐに検出されました。

とにかく、私はオラクルがこのような場合に例外をスローすることを期待しています。

私の質問は、そのような動作が機能かバグかどうかです。 機能の場合は、どこに役立つのでしょうか?

ありがとうございました。

ところで、SQLiteでは、同様のクエリを実行することは許可されず、 'WIThテーブル名の重複'例外がスローされます。他のdbエンジンはまだ試していませんでした。

+0

Postgresはこれを許可していません。 –

+1

私はそれがバグだと思います。あなたは確かにMy Oracle Supportで問題を提起することができます。 –

+0

12.1.0.2で再現されました。 –

答えて

-2

これは有用ではありませんが、Oracleが重複する列名を処理する方法と一致しています。

+1

これを詳しく教えてください。Oracleは他のDBMSが通常は持たない列名を重複して何をしますか? –

1

WITH句は、関数でも使用できます。私はこれが11gで利用可能かどうかはわかりませんが、12cで利用可能です。したがって、この "バグ"は、オーバーロードされた機能のために必要な場合があります。

たとえば、この手順では、入力/出力データ型が同じで、まったく同じ関数を2回使用します。

WITH 
    FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS 
BEGIN 
RETURN 'date is '|| pid; 
END; 
    FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS 
BEGIN 
RETURN 'date is '|| pid; 
END; 
SELECT get_date(cast(sysdate as varchar2(20))) 
FROM dual 
; 
/

予想したように、それはエラーを返します。

ORA-06553: PLS-305: previous use of 'GET_DATE' (at line 1) conflicts with this use 

をしかし、あなたは、関数をオーバーロードするので、それは同じ名前を持つが、異なるパラメータタイプを受け入れる場合、それが動作します。プロシージャーはエラーなしで実行され、変数のデータ・タイプに応じて、正しい関数が使用されます。

WITH 
    FUNCTION get_date(pid IN VARCHAR2) RETURN VARCHAR2 IS 
BEGIN 
RETURN 'date is '|| pid; 
END; 
    FUNCTION get_date(pid IN DATE) RETURN VARCHAR2 IS 
BEGIN 
RETURN pid+1; 
END; 
SELECT 
get_date(cast(sysdate as varchar2(20))) /*example1*/ 
--get_date(sysdate)     /*example2*/ 
FROM dual 
; 
/

例1つの出力:date is 16-MAR-17 例2出力:17-MAR-17

をので、おそらく同じ名前のサブクエリを使用することができるが、オーバーロード機能を可能に関連しています。それはまだバギーのようですが、私はこれに関する文書を見つけることができませんでした。

関連する問題