甲骨文 - 提示CURSOR_SHARING_EXACT没有在“选择事例”语句的工作

问题描述:

我使用cursor_sharing设置=“力”下面的语句
这可以通过SYSTEM用户运行设置:
ALTER SYSTEM SET cursor_sharing设置=“力”范围=两者;甲骨文 - 提示CURSOR_SHARING_EXACT没有在“选择事例”语句的工作

对于少数查询,我想使用提示CURSOR_SHARING_EXACT,但它在CASE语句中失败。

例如,Query1工作,但提示CURSOR_SHARING_EXACT(Query2)失败。

请说明为什么存在缺失的表达
注:我不能把CURSOR_SHARING_EXACT在外选取它的工作原理。

查询1:

SELECT CASE
WHEN(选择1从双其中1 = 2)IS NOT NULL
THEN 'Y' ELSE 'N' END温度FROM双重;

输出查询1的:Ñ

QUERY2:

SELECT CASE
WHEN(选择/ * + CURSOR_SHARING_EXACT */1从双其中1 = 2)不NULL
THEN'Y'ELSE'N'END temp 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数据库12c标准版版本12.1.0.2.0 - 64位生产,TNS for Linux:版本12.1.0.2。0 - 生产 –

+0

Woops,我没有使用'alter system set cursor_sharing ='FORCE''。一旦我改变了这个值(并且运行'alter system flush shared_pool'),我可以在每个系统上重现它。 –

1)我把HINT放在父查询上,现在没关系,试着这么做:

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)或作为临时解决方案,也许你可以使用decodecase instaed:

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

如果提示被添加到外部选择,它的工作原理(问题中提到),但由于一些限制,我不能把它放在那里。 –