首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从.txt文件中使用unix在from和where之间提取表名

如何从.txt文件中使用unix在from和where之间提取表名
EN

Stack Overflow用户
提问于 2016-04-28 05:32:13
回答 1查看 431关注 0票数 0

我有这样的档案..。

代码语言:javascript
复制
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 || '))';

我需要过滤表名之间的距离和地点..。请帮忙..。提前谢谢..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-28 08:24:45

假设您的输入位于a.txt文件中;下面是如何处理每个单词:

代码语言:javascript
复制
 cat a.txt | tr -cs 'A-Za-z0-9_' '[\n*]' |  tr -s '[:lower:]' '[:upper:]'

第一部分只保留白体字符,并将每个字符放在一行上;第二部分确保所有内容都大写,以便于处理。

以上将只列出单词,每个字都列在一行:

代码语言:javascript
复制
SELECT
COUNT
INTO
L_COUNT
FROM
AR_APROVAL_USER_LIMITS
WHERE
DOCUMENT_TYPE
CM
AND
CURENCY_CODE
AR_APROVAL_USER_LIMITS
CURENCY_CODE
[....]

然后,我们可以使用awk来处理这个流:读取每一行,如果从中找到,则只需编写以下行:

代码语言:javascript
复制
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} 
}'

在您的投入下,这将提供:

代码语言:javascript
复制
AR_APROVAL_USER_LIMITS
AR_APROVAL_USER_LIMITS
AR_APROVAL_USER_LIMITS
FND_USER

它符合你的要求。但是要小心,如果FROMWHERE之间有多个表,就会错过它;所以您应该选择:

查找FROM,然后写到行为WHERE

代码语言:javascript
复制
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=""} 
}'

也要小心,因为如果有sql-联接,这是行不通的。现在您知道了,也许您可以为这种情况寻找一个自己的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36906019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档