Oracle - 提示CURSOR_SHARING_EXACT在“Select Case”语句中不起作用

时间:2017-08-08 23:45:52

标签: sql oracle database-administration

我正在使用 cursor_sharing ='FORCE'
这可以由SYSTEM用户执行以下语句来设置:
alter system set cursor_sharing ='FORCE'cope = both;

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

例如,Query1有效,但使用提示CURSOR_SHARING_EXACT(Query2)的同一查询失败。

请说明为什么表达不足
注意:我不能把CURSOR_SHARING_EXACT放在它工作的外部SELECT上。

查询1:

  

选择案例
      WHEN(从1中选择1,其中1 = 2)IS NOT NULL
      然后'''''''''''''''''''''''''''''''''''''

Query1的输出: N

查询2:

  

选择案例
      WHEN(选择/ * + CURSOR_SHARING_EXACT * / 1来自双,其中1 = 2)IS NOT NULL
      然后'''''''''''''''''''''''''''''''''''''

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 个答案:

答案 0 :(得分:1)

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的{​​{1}}个实例:

case

3)另一种替代解决方案是:

SELECT DECODE ((select /*+ CURSOR_SHARING_EXACT */ 1 from dual where 1 = 2), NULL, 'N', 'Y') FROM dual;