2013-12-14 30 views
1

我嘗試通過讀取unix框中的sql腳本或shell腳本來生成輸出,並使用語句功能(創建,刪除,更新,刪除,合併,插入)以及表名生成輸出文件。我嘗試以通用的方式完成這個輸出來讀取任何代碼並生成輸出。這可以通過awk編程來實現。從sql腳本中提取模式

輸出

MERGE|temp_st_rx_wk_str_ip_rpt 
SELECT|rx_ov_ord_excep_str_sku 
SELECT|ndc 
SELECT|fiscal_week 
SELECT|store 
SELECT|dss_saf_user01.rx_ov_ord_exclu_str 
SELECT|rx_osv_invoice_str_ndc 
DROP|temp_extract 
CREATE|temp_build_extract 
SELECT|temp_st_rx_wk_str_ip_rpt 

CODE

merge into temp_st_rx_wk_str_ip_rpt s 
    USING (SELECT b.week_nbr, 
        b.store_nbr, 
        SUM (NVL (a.orig_on_ord_qty, 0)) AS mnd_ov_ord_orig_qty, 
        SUM (NVL (b.inv_qty, 0)) AS mnd_ov_inv_qty 
      FROM (SELECT /*+ PARALLEL (s,8) */ w.week_nbr, s.store_nbr, s.ndc_nbr, 
          SUM (s.orig_on_ord_qty) AS orig_on_ord_qty 
        FROM rx_ov_ord_excep_str_sku s, 
          ndc n, 
          fiscal_week w, 
          store st 
        WHERE s.ndc_nbr = n.ndc_nbr 
         AND s.store_nbr = st.store_nbr 
         AND s.ord_dt BETWEEN w.start_dt AND w.end_dt 
         AND n.schd_drug_cd NOT IN (''02'', ''07'') 
         AND n.gen_brand_ind <> ''Y'' 
         AND s.orig_on_ord_qty < 1000 -- Arbitrary value used to exclude bad data 
         AND w.week_nbr = &P_WEEK_NBR 
         AND st.area_nbr NOT IN (0, 10, 11) 
         AND st.pharm_ind = ''Y'' 
         AND s.store_nbr NOT IN 
           (SELECT store_nbr 
            FROM dss_saf_user01.rx_ov_ord_exclu_str 
            WHERE rx_ov_ord_exclu_cd = ''CP'') 
        GROUP BY w.week_nbr, s.store_nbr, s.ndc_nbr) a, 
        (SELECT /*+ INDEX (s,RX_OSV_INVOICE_STR_NDC_PK) */ 
          w.week_nbr, s.store_nbr, s.ndc_nbr, 
          SUM (s.inv_qty) AS inv_qty 
        FROM rx_osv_invoice_str_ndc s, 
          ndc n, 
          store st, 
          fiscal_week w 
        WHERE s.ndc_nbr = n.ndc_nbr 
         AND s.store_nbr = st.store_nbr 
         AND s.ord_dt BETWEEN w.start_dt AND w.end_dt 
         AND s.ord_type_cd <> ''F'' 
         AND n.schd_drug_cd NOT IN (''02'', ''07'') 
         AND n.gen_brand_ind <> ''Y'' 
         AND s.inv_qty > 0 
         AND w.week_nbr = &P_WEEK_NBR 
         AND st.area_nbr NOT IN (0, 10, 11) 
         AND st.pharm_ind = ''Y'' 
         AND s.store_nbr NOT IN 
           (SELECT store_nbr 
            FROM dss_saf_user01.rx_ov_ord_exclu_str 
            WHERE rx_ov_ord_exclu_cd = ''CP'') 
        GROUP BY w.week_nbr, s.store_nbr, s.ndc_nbr) b 
      WHERE a.week_nbr (+) = b.week_nbr 
       AND a.store_nbr (+) = b.store_nbr 
       AND a.ndc_nbr (+) = b.ndc_nbr 
      GROUP BY b.week_nbr, b.store_nbr) t 
    ON (t.week_nbr = s.week_nbr 
    AND t.store_nbr = s.store_nbr) 
    WHEN NOT MATCHED 
    THEN 
     INSERT (week_nbr, store_nbr, mnd_ov_ord_orig_qty, mnd_ov_inv_qty) 
     VALUES (t.week_nbr, t.store_nbr, t.mnd_ov_ord_orig_qty, t.mnd_ov_inv_qty) 
    WHEN MATCHED 
    THEN 
     UPDATE SET 
      s.mnd_ov_ord_orig_qty = t.mnd_ov_ord_orig_qty, 
      s.mnd_ov_inv_qty = t.mnd_ov_inv_qty'; 

commit; 

drop table temp_extract; 

create table temp_build_extract as select * from temp_st_rx_wk_Str_ip_rpt; 
+1

你如何決定哪個語句被提取? –

+0

所有要提取的語句。 – AruM

+1

對不起,我不熟悉SQL ..在你的輸出中,你沒有提取所有。例如「WHERE」缺失。 –

回答

1

你可以試試:

awk -f e.awk input.txt 

其中input.txt是輸入文件(CODE),和e.awk

/^merge/{ 
    if (match($0,/merge into ([^[:blank:]]+)/,a)) { 
     print "MERGE|"a[1] 
     next 
    } 
} 

/FROM [^(]/ { 
    getFromTabs() 
    if (match(from,/FROM ([^[:blank:]]+)/,a)) { 
     printKey(a[1]) 
     do { 
      ind=index(from,",") 
      if (ind) { 
       from=substr(from,ind+1) 
       match(from,/[[:space:]]*([[:alnum:]]+)/,a) 
       printKey(a[1]) 
      } 
     } 
     while (ind) 
    } 
}  

/^drop/ { 
    if (match($0,/drop table ([^[:blank:]]+)/,a)) { 
     print "DROP|"a[1] 
     next 
    } 

} 

/^create/ { 
    if (match($0,/create table ([^[:blank:]]+)/,a)) { 
     print "CREATE|"a[1] 
    } 
    if (match($0,/select.*[[:blank:]]([^[:blank:]]+);/,a)) { 
     print "SELECT|"a[1] 
    } 
} 

function printKey(key) { 
    if (!(key in T)) { 
     print "SELECT|"key 
     T[key]++ 
    } 
} 

function getFromTabs(p) { 
    p=0 
    from="" 
    do { 
     from=(p++==0)?$0:(from ORS $0) 
     getline 
    } 
    while (!/WHERE/) 
} 

對於上面這個示例代碼生成輸出:

MERGE|temp_st_rx_wk_str_ip_rpt 
SELECT|rx_ov_ord_excep_str_sku 
SELECT|ndc 
SELECT|fiscal 
SELECT|store 
SELECT|dss_saf_user01.rx_ov_ord_exclu_str 
SELECT|rx_osv_invoice_str_ndc 
DROP|temp_extract; 
CREATE|temp_build_extract 
SELECT|temp_st_rx_wk_Str_ip_rpt 

(請注意,我什麼都不知道SQL,所以你必須檢查,如果這看起來不錯給你)

+0

fiscal_week作爲財政 – AruM

+0

@AruM嘗試用'[[:graph:]]替換'[[:alum:]]'' –

+0

(ibmetlt-bat1)bat_spif> awk -f e.awk input.txt 語法錯誤源代碼行爲2. 錯誤上下文爲 if(match($ 0,/ merge into >>>([^ [:blank:]] +)/,< << awk:語句無法正確解析 源代碼行是2. 語法錯誤源代碼行是6. awk:有一個缺少的字符 – AruM