2017-08-08 10 views
1

私はCURSOR_SHARING =を使用しています 'FORCE'
これは、次の文を実行SYSTEMユーザーが設定することができます。
ALTER SYSTEM CURSOR_SHARINGが= 'FORCE' を設定しますスコープ=両方;のOracle - ヒントCURSOR_SHARING_EXACTは 'のSelect Case' 文では動作しません

ヒント数が少ない場合はヒントCURSOR_SHARING_EXACTを使用したいが、CASEステートメントでは失敗している。例えば

、Query1をは動作しますが、ヒントCURSOR_SHARING_EXACT(QUERY2)と同じクエリが失敗します。それが動作する場所を選択私は外にCURSOR_SHARING_EXACTを置くことはできません。

欠け表現
ノートがある理由を示唆してください。

クエリー1:


THEN 'Y' ELSEデュアル 'からN' 末端TEMP NULLされていない(ただし、1 = 2デュアルから1を選択)SELECT CASE
。 Query1をの

出力: N

QUERY2:

SELECT CASE
WHEN(選択/ * + CURSOR_SHARING_EXACT *デュアルから/ 1 1 = 2)ではありませんNULL
THEN 'Y' ELSE 'N' END FROM dual;

出力QUERY2の(エラー):

Error starting at line 1 in command: 
SELECT CASE 
WHEN (select /*+ CURSOR_SHARING_EXACT */ 1 from dual where 1 = 2) IS NOT NULL 
THEN 'Y' ELSE 'N' END temp FROM dual 
Error at Command Line:2 Column:7 
Error report: 
SQL Error: ORA-00936: missing expression 

00936. 00000 - "不足している表現"
*原因:
処置:

+0

私はエラーを再現することはできません11.2.0.4(Solaris)、12.1.0.2(Solaris)、または12.2.0.1(Windows)。どのバージョンとプラットフォームで実行していますか? –

+0

Oracleバージョン:Oracle Database 12c Standard Editionリリース12.1.0.2.0 - 64bit Production、Linux用TNS:バージョン12.1.0.2。0 - Production –

+0

私は 'alter system set cursor_sharing = 'FORCE''を使用していませんでした。私がその値を変更すると( 'alter system flush shared_pool'を走らせて)、私はすべてのシステムでそれを再現することができました。 –

答えて

1

1)私はHINTを親クエリに入れました。これでOKです。

SELECT /*+ CURSOR_SHARING_EXACT */ 
    CASE 
    WHEN (SELECT /*+ CURSOR_SHARING_EXACT */ 1 from dual where 1 = 2) IS NOT NULL 
     THEN 'Y' 
     ELSE 'N' 
END temp 
FROM dual; 

2)OR一時的な解決策として、多分あなたはdecode instaed caseを使用することができます。また、別の代替ソリューションです

SELECT DECODE ((select /*+ CURSOR_SHARING_EXACT */ 1 from dual where 1 = 2), NULL, 'N', 'Y') FROM dual; 

3):

WITH demo AS (
    SELECT /*+ CURSOR_SHARING_EXACT */ <col1> from <table_name> 
     where <some_conditions>) 
    SELECT CASE 
      WHEN d.col1 IS NOT NULL 
       THEN 'Y' 
       ELSE 'N' 
      END temp 
    FROM dual, demo d; 
+0

cursor_sharing = EXACTを使用してスクリプトを実行すると、プランがキャッシュされます。 したがって、cursor_sharingをFORCEに戻した後は、クエリを少し変更します(1 = 2から11 = 22に変更)、失敗します。 –

+0

@VSはい、そうです、この点は忘れました。私は分析を続行します... – Ikrom

+0

ヒントが外側の選択に追加された場合、(質問に記載されているように)動作しますが、いくつかの制限のためにそこに置くことはできません。 –

関連する問題