2017-08-10 70 views
0

关于我的其他问题(Pivot Multiple Tables with Default Values),参考透视型游标在PL/SQL

我怎么能使用结果集的透视型的SQL在PL/SQL块? 数据集是以下:

ELEMENT_NAME    ELEMENT_ENTRY_ID 1_INPUT_VALUE  1_SCREEN_ENTRY_VALUE 2_INPUT_VALUE 2_SCREEN_ENTRY_VALUE 3_INPUT_VALUE 3_SCREEN_ENTRY_VALUE 4_INPUT_VALUE 4_SCREEN_ENTRY_VALUE 5_INPUT_VALUE 5_SCREEN_ENTRY_VALUE   
------------------------ ------------------- ---------------- -------------------- --------------- ----------------------- --------------- ---------------------- --------------- ----------------------- --------------- ---------------------- 
VERTEX      72249257   393     0      395          391          392    33-000-0000    394           
ALC Workers Compensation 72249258   393     0      395          394          391          392    33-065-0000     
PTO Taken Plan    72523856   392     33-065-3190    391          393    0      395          394           
Regular Wages    72249260   234     9.7      236          235          233                     
US_TAX_VERTEX    72249259   391           394          393    100      395          392    33-065-2920     
Workers Compensation  72249256   455           456    33-000-0000                                  

我试图使用提供查询的答案在下面的块,但它的示数出来:

declare 

    cursor C_cur is 
    select * 
    from (With src As (SELECT lmnt.element_name 
           , lmnt.element_entry_id 
           , nval.input_value_id 
           , nval.screen_entry_value 
           , row_number() over (partition by lmnt.element_name, lmnt.element_entry_id 
                order by lmnt.element_name ) rn 
          FROM XX_SAMPLE_ELEMENTS lmnt 
           , XX_ENTRY_VALUES nval 
           , XX_ELEMENT_VALUES eval 
          where lmnt.element_entry_id = nval.element_entry_id 
          and  eval.INPUT_VALUE_ID = nval.INPUT_VALUE_ID   
          order by lmnt.element_name) 
      SELECT * FROM src 
      PIVOT (max(input_value_id) As input_value, 
        min(screen_entry_value) as screen_entry_value 
        FOR (rn) IN (1,2,3,4,5))); 

    l_input_value varchar2(100); 

begin 

    for C_rec in C_cur loop 
     l_input_value := C_rec.1_INPUT_VALUE; 
    end loop; 

end;   

PLS-00103:出现符号期待以下某种情况时“.1”:。 (* @%& = - +; < /> at in是多重成员子多义集06550之间的mod剩余部分不是rem <>或= =或= => = < = <>或like like2 like4 likec。行%S,列%S:\ n%S” *原因:通常一个PL/SQL编译错误 *操作:

我怎么能参考的第一个输入值1_INPUT_VALUE

+1

您可以将该字段引用为引用标识符“1_INPUT_VALUE”。不过,我会建议别名IN列表。例如:'FOR(rn IN(1 AS N1,2 AS N2 ...')。这样做应该让你的透视列名称为N1_INPUT_VALUE,我相信它不需要加上引号。 –

+0

@HepC,这绝对有效!请将其作为答案,以便我能够投票。 –

回答

2

你?有两个选项可以解决这个问题:首先是使用带引号的标识符,围绕在双引号内的列名。

declare 

    cursor C_cur is 
    select * 
    from (With src As (SELECT lmnt.element_name 
           , lmnt.element_entry_id 
           , nval.input_value_id 
           , nval.screen_entry_value 
           , row_number() over (partition by lmnt.element_name, lmnt.element_entry_id 
                order by lmnt.element_name ) rn 
          FROM XX_SAMPLE_ELEMENTS lmnt 
           , XX_ENTRY_VALUES nval 
           , XX_ELEMENT_VALUES eval 
          where lmnt.element_entry_id = nval.element_entry_id 
          and  eval.INPUT_VALUE_ID = nval.INPUT_VALUE_ID   
          order by lmnt.element_name) 
      SELECT * FROM src 
      PIVOT (max(input_value_id) As input_value, 
        min(screen_entry_value) as screen_entry_value 
        FOR (rn) IN (1,2,3,4,5))); 

    l_input_value varchar2(100); 

begin 

    for C_rec in C_cur loop 
     l_input_value := C_rec."1_INPUT_VALUE"; -- !! Change here 
    end loop; 

end; 

另一个选项(我个人比较喜欢)是给数据透视表一个别名,它允许它符合非引号标识符规则。例如:

declare 

    cursor C_cur is 
    select * 
    from (With src As (SELECT lmnt.element_name 
           , lmnt.element_entry_id 
           , nval.input_value_id 
           , nval.screen_entry_value 
           , row_number() over (partition by lmnt.element_name, lmnt.element_entry_id 
                order by lmnt.element_name ) rn 
          FROM XX_SAMPLE_ELEMENTS lmnt 
           , XX_ENTRY_VALUES nval 
           , XX_ELEMENT_VALUES eval 
          where lmnt.element_entry_id = nval.element_entry_id 
          and  eval.INPUT_VALUE_ID = nval.INPUT_VALUE_ID   
          order by lmnt.element_name) 
      SELECT * FROM src 
      PIVOT (max(input_value_id) As input_value, 
        min(screen_entry_value) as screen_entry_value 
        FOR (rn) IN (1 AS N1,2 AS N2,3 AS N3,4 AS N4,5 AS N5))); -- !! Change here 

    l_input_value varchar2(100); 

begin 

    for C_rec in C_cur loop 
     l_input_value := C_rec.N1_INPUT_VALUE; -- !! Change here 
    end loop; 

end;