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;