【问题标题】:Get Teradata BTEQ query result in a unix variable在 unix 变量中获取 Teradata BTEQ 查询结果
【发布时间】:2014-09-15 05:30:59
【问题描述】:

我正在编写一个 shell 脚本,我需要将 Teradata 中的 BTEQ 查询结果转换为一个 unix 变量。

我试过了,

    testabcd=$(bteq << EOF 2>&1 >> $LOG_FILE
     .LOGON ${HOST}/${USER},${PASSWORD}
     DATABASE ${SRC_DB};
     .set width 2000;
      .set titledashes off;
     SELECT COUNT(*) FROM ${SRC_DB}.${SOURCE_TABLE};
    .LOGOFF;
    .QUIT;
    .EXIT
     EOF)

      echo "The count is: " $testabcd

查询成功运行,但没有为变量分配输出。有什么建议吗?

【问题讨论】:

  • 我现在无法测试,但应该还有列标题,试试 SELECT COUNT(*) (TITLE '') ...
  • 不,我的意思是它有一个列标题,我需要的只是变量中的相同输出。

标签: shell unix ksh teradata


【解决方案1】:

问题是这个重定向:

2>&1 >> $LOG_FILE

这实际上意味着“将标准错误和标准输出发送到文件 $LOG_FILE”。由于 stderr 和 stdout 被重定向,该命令不会向 shell 发送任何输出,因此命令替换不会捕获任何内容。示例:

$ test=$(echo "Hello" 2>&1)
$ echo $test
Hello   // as expected
$ test2=$(echo "Hello" 2>&1 >> example.log)
$ echo $test2
        // is empty, as output has been redirected
$ cat example.log
Hello   // here is the redirected output

bteq 命令的输出将在 $LOG_FILE 中找到 - 如果您想将其保存在变量中,则需要删除重定向:

testabcd=$(bteq << EOF 2>&1 
....

【讨论】:

  • 谢谢!!我尝试删除 >>$LOG_FILE 路径,但问题是,BTEQ 会将查询的所有状态消息作为输出发送,并且需要大量处理才能提取我想要的唯一计数,但我发现 EXPORT 输出BTEQ 中的 to File 选项解决了这个问题。
【解决方案2】:

不需要额外的文件:

testabcd=$(bteq << EOF 2>&1  |grep '^>' |sed -e "s/^>//"
 .LOGON ${HOST}/${USER},${PASSWORD}
 DATABASE ${SRC_DB};
 .set width 2000;
  .set titledashes off;
 SELECT '>'||COUNT(*) FROM ${SRC_DB}.${SOURCE_TABLE};
.LOGOFF;
.QUIT;
.EXIT
 EOF)

'&gt;'||COUNT(*): &gt; 标记我们真正想要的查询输出。

grep '^&gt;':过滤标记的文本。避免使用 bteq 工件。

sed -e "s/^&gt;//": 摆脱 flag &gt;.

【讨论】:

  • 你能解释一下 grep 和 sed 是做什么的吗?
【解决方案3】:

试试这个方法:

testabcd(){
bteq << EOFBT |grep '^>' |sed -e "s/^>//"
.SET ERROROUT STDOUT
.SET ECHOREQ ON
.SET INDICDATA OFF
.SET QUIET OFF
.SET SIDETITLES OFF
.SET TIMEMSG QUERY
.SET TITLEDASHES OFF

.LOGON ${LOGIN_TD_DWC};

 SELECT '>'||'ANTON';

 .LOGOFF;
.QUIT;
EOFBT
}

var_test=$(testabcd)

echo $var_test

【讨论】:

    【解决方案4】:

    我找不到将查询输出分配给变量的任何直接方法,而是必须将输出写入文件并读取它。

          ERR_COUNT_FILE="err_count.txt"
          cat null > $ERR_COUNT_FILE
          bteq << EOF >>${LOG_FILE} 2>&1
          .LOGON ${HOST}/${USER},${PASSWORD}
             DATABASE ${SRC_DB};
             .set titledashes off;
             .set heading '';
          .EXPORT FILE=${ERR_COUNT_FILE}
    
          SELECT COUNT(*) from ${SRC_DB}.${SOURCE_TABLE};
    
          .EXPORT RESET
          EOF
          sed -i '1d;s/[[:blank:]]//g' $ERR_COUNT_FILE /* Remove header line and all blank spaces from the file*/
          count_err=$(cat ${ERR_COUNT_FILE})
          echo $count_err
    

    我找不到更简单的方法。

    【讨论】:

      【解决方案5】:

      试试这个:

      count=$(echo "SELECT '>'||COUNT(*) FROM YOUR_DBNAME.YOUR_TABLENAME" | bteq .LOGON ${HOST}/${USER},${PASSWORD} 2>&1 |grep '^>' |sed -e "s/^>//");
      

      使用这个,我们编写了一行bteq查询,结果存储在变量count中,所以可以使用。

      不需要额外的文件或任何东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-22
        相关资源
        最近更新 更多