2016-04-28 45 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

相关问题