私は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 - "不足している表現"
*原因:
処置:
私はエラーを再現することはできません11.2.0.4(Solaris)、12.1.0.2(Solaris)、または12.2.0.1(Windows)。どのバージョンとプラットフォームで実行していますか? –
Oracleバージョン:Oracle Database 12c Standard Editionリリース12.1.0.2.0 - 64bit Production、Linux用TNS:バージョン12.1.0.2。0 - Production –
私は 'alter system set cursor_sharing = 'FORCE''を使用していませんでした。私がその値を変更すると( 'alter system flush shared_pool'を走らせて)、私はすべてのシステムでそれを再現することができました。 –