甲骨文 - 提示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 - “缺失表达”
*原因:
*操作:
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)或作为临时解决方案,也许你可以使用decode
的case
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;
当使用cursor_sharing = EXACT运行脚本时,计划被缓存。 因此,在将cursor_sharing更改为FORCE之后,稍微更改查询(将1 = 2更改为11 = 22),并且将失败。 –
@VS是的,你是对的,我忘了这一点。我会继续分析...... – Ikrom
如果提示被添加到外部选择,它的工作原理(问题中提到),但由于一些限制,我不能把它放在那里。 –
我无法重现错误11.2.0.4(Solaris),12.1.0.2(Solaris)或12.2.0.1(Windows)。你正在运行什么版本和平台? –
Oracle版本:Oracle数据库12c标准版版本12.1.0.2.0 - 64位生产,TNS for Linux:版本12.1.0.2。0 - 生产 –
Woops,我没有使用'alter system set cursor_sharing ='FORCE''。一旦我改变了这个值(并且运行'alter system flush shared_pool'),我可以在每个系统上重现它。 –