2017-08-10 37 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;