Oracle - 提示 CURSOR_SHARING_EXACT 在 'Select Case' 语句中不起作用
Oracle - Hint CURSOR_SHARING_EXACT is not working in 'Select Case' statements
我正在使用 cursor_sharing='FORCE'
这可以由 SYSTEM 用户执行以下语句来设置:
改变系统设置cursor_sharing='FORCE' scope=both;
对于少数查询,我想使用提示 CURSOR_SHARING_EXACT,但它在 CASE 语句中失败。
例如,Query1 有效,但具有提示 CURSOR_SHARING_EXACT (Query2) 的相同查询失败。
请提出缺少表达式的原因
注意: 我不能把 CURSOR_SHARING_EXACT 放在外面的 SELECT 它可以工作的地方。
查询 1:
SELECT CASE
WHEN (select 1 from dual where 1 = 2) IS NOT NULL
THEN 'Y' ELSE 'N' END temp FROM dual;
查询 1 的输出: N
查询 2:
SELECT CASE
WHEN (select /*+ CURSOR_SHARING_EXACT */ 1 from dual where 1 = 2) IS NOT 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 - "missing expression"
*Cause:
*Action:
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
:
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='FORCE'
这可以由 SYSTEM 用户执行以下语句来设置:
改变系统设置cursor_sharing='FORCE' scope=both;
对于少数查询,我想使用提示 CURSOR_SHARING_EXACT,但它在 CASE 语句中失败。
例如,Query1 有效,但具有提示 CURSOR_SHARING_EXACT (Query2) 的相同查询失败。
请提出缺少表达式的原因
注意: 我不能把 CURSOR_SHARING_EXACT 放在外面的 SELECT 它可以工作的地方。
查询 1:
SELECT CASE
WHEN (select 1 from dual where 1 = 2) IS NOT NULL
THEN 'Y' ELSE 'N' END temp FROM dual;
查询 1 的输出: N
查询 2:
SELECT CASE
WHEN (select /*+ CURSOR_SHARING_EXACT */ 1 from dual where 1 = 2) IS NOT 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 - "missing expression"
*Cause:
*Action:
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
:
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;