2016-04-28 21 views
0

我有這樣的文件之間..我如何提取表名來自何地使用unix,從.txt文件

SELECT COUNT(*) INTO L_COUNT 
    FROM AR_APPROVAL_USER_LIMITS 
    WHERE DOCUMENT_TYPE = 'CM' 
    AND CURRENCY_CODE = :AR_APPROVAL_USER_LIMITS.CURRENCY_CODE 
    AND REASON_CODE = :AR_APPROVAL_USER_LIMITS.REASON_CODE 
     AND PRIMARY_FLAG = :AR_APPROVAL_USER_LIMITS.PRIMARY_FLAG 
    AND ((AMOUNT_FROM BETWEEN :AR_APPROVAL_USER_LIMITS.AMOUNT_FROM AND 
        :AR_APPROVAL_USER_LIMITS.AMOUNT_TO) 
     OR (AMOUNT_TO BETWEEN :AR_APPROVAL_USER_LIMITS.AMOUNT_FROM AND 
        :AR_APPROVAL_USER_LIMITS.AMOUNT_TO) 
     OR ((AMOUNT_FROM <:AR_APPROVAL_USER_LIMITS.AMOUNT_FROM) AND 
      (AMOUNT_TO >:AR_APPROVAL_USER_LIMITS.AMOUNT_TO))) 
     AND USER_ID != :AR_APPROVAL_USER_LIMITS.USER_ID; 
    SELECT COUNT(*) 
    INTO L_COUNT 
    FROM AR_APPROVAL_USER_LIMITS 
    WHERE DOCUMENT_TYPE = 'CM' 
    AND CURRENCY_CODE = :AR_APPROVAL_USER_LIMITS.CURRENCY_CODE 
    AND REASON_CODE = :AR_APPROVAL_USER_LIMITS.REASON_CODE 
    AND USER_ID = :AR_APPROVAL_USER_LIMITS.USER_ID; 
    SELECT COUNT(*) INTO L_COUNT 
    FROM AR_APPROVAL_USER_LIMITS 
    WHERE DOCUMENT_TYPE = 'CM' 
    AND CURRENCY_CODE = :AR_APPROVAL_USER_LIMITS.CURRENCY_CODE 
    AND REASON_CODE = :AR_APPROVAL_USER_LIMITS.REASON_CODE 
     AND PRIMARY_FLAG = :AR_APPROVAL_USER_LIMITS.PRIMARY_FLAG 
    AND ((AMOUNT_FROM BETWEEN :AR_APPROVAL_USER_LIMITS.AMOUNT_FROM AND 
        :AR_APPROVAL_USER_LIMITS.AMOUNT_TO) 
     OR (AMOUNT_TO BETWEEN :AR_APPROVAL_USER_LIMITS.AMOUNT_FROM AND 
        :AR_APPROVAL_USER_LIMITS.AMOUNT_TO) 
     OR ((AMOUNT_FROM <:AR_APPROVAL_USER_LIMITS.AMOUNT_FROM) AND 
      (AMOUNT_TO >:AR_APPROVAL_USER_LIMITS.AMOUNT_TO)) 
    ); 
     DEF_WHERE := ADD_AND(DEF_WHERE) || '((USER_ID) IN '||'(SELECT 
      USER_ID '||'FROM FND_USER WHERE '|| SUB_WHERE || '))'; 

我需要從哪裏之間過濾表名..請幫助..在此先感謝..

+0

所以你想檢索'from'和'where'之間的所有表名? – ritesht93

+0

是的,通過使用shell腳本.. – STEFAN

+0

unix ..我已經通過使用shell f60gen將oracle格式的.fmb文件轉換爲.txt文件。現在我需要篩選在select語句中使用的表名。我嘗試通過使用SQL,PLSQL無法做到這一點..所以我認爲這可以通過使用shell腳本..所以有任何命令來過濾它.. – STEFAN

回答

0

說你的輸入站在a.txt文件;下面是如何處理每一個字:

cat a.txt | tr -cs 'A-Za-z0-9_' '[\n*]' | tr -s '[:lower:]' '[:upper:]' 

第一部分只保留alphanum字符,並把每一個在一行;第二部分確保所有內容都以大寫字母表示,以便於處理。

以上僅列舉的話,每一條線:

SELECT 
COUNT 
INTO 
L_COUNT 
FROM 
AR_APROVAL_USER_LIMITS 
WHERE 
DOCUMENT_TYPE 
CM 
AND 
CURENCY_CODE 
AR_APROVAL_USER_LIMITS 
CURENCY_CODE 
[....] 

然後我們就可以用處理此流量:你讀的每一行,如果你找到,那麼你只寫了下面這行:

cat a.txt | tr -cs 'A-Za-z_' '[\n*]' | tr -s '[:lower:]' '[:upper:]' |\ 
awk ' { 
    if($0=="FROM") {p="FROM"} 
    else if (p=="FROM") {p="" ; print $0} 
}' 

隨着你的輸入,這給:

AR_APROVAL_USER_LIMITS 
AR_APROVAL_USER_LIMITS 
AR_APROVAL_USER_LIMITS 
FND_USER 

它matche是你的要求。但要小心,如果在FROMWHERE之間有多個表格,你會錯過它;所以你應該去:

其中尋找FROM,然後寫,直到行是WHERE

cat a.txt | tr -cs 'A-Za-z_' '[\n*]' | tr -s '[:lower:]' '[:upper:]' |\ 
awk ' { 
    if($0=="FROM") {p="FROM"} 
    else if (p=="FROM" && $0!="WHERE") {print $0} 
    else {p=""} 
}' 

小心也,因爲如果有 s此不起作用。現在你明白了,也許你可以在這個案例中尋找你自己的解決方案。

+0

正在工作..謝謝.. – STEFAN

相關問題