SQL*加上如何在一条语句中执行环境设置和查询



我执行以下查询,它返回一个值,它工作得很好。

echo "select myquery ;" | sqlplus user/pass@dbase | | head -4 | tail -1

问题是,当返回的一个值太大时,它会分成多行,因此我进一步使用的ETL工具会出现问题。因此,我尝试使用linesize选项,但我无法将其与查询相结合。

如果我连接到sqlplus并运行:SET LINESIZE 3200后面跟着select myquery ;,输出很好,但是我不能在echo语句中组合它们。我尝试了不同的方法,例如:

echo "SET LINESIZE 3200 / select myquery ;" | sqlplus user/pass@dbase | | head -4 | tail -1

任何想法?

谢谢!

你可以试试这个吗:

sqlplus user/pass@dbase << "EOF" |...| head -4 | tail -1
SET LINESIZE 3200;
select myquery ;
EOF

一个heredoc(如@Philippe的回答所示)将更容易阅读和维护,但如果出于某种原因您真的想将其保持在一行中,您可以将-e标志添加到echo并嵌入新行:

echo -e "SET LINESIZE 3200 n select myquery ;" | sqlplus user/pass@dbase | head -4 | tail -1

或使用printf:

printf "set linesize 3200 n select myquery ;n" | sqlplus user/pass@dbase | head -4 | tail -1

(在这两个我已经拿出额外的|从你的原始版本)

您可以扩展它以避免需要对输出进行开头和结尾:

printf "set linesize 3200 n set pagesize 0 n set feedback off n select myquery ;n" | sqlplus -s user/pass@dbase

或与各种set选项组合使用:

printf "set linesize 3200 pagesize 0 feedback off n select myquery ;n" | sqlplus -s user/pass@dbase

-s抑制横幅;从你使用的头尾值来看,我想你已经知道了,只是没有展示出来。(我通常也会加入-l,这样如果凭证错误,它就不会卡住。)其他set命令删除列标题和"1行选定"。消息。

虽然这是一个较长的单个命令行,但它的优点是不会操纵/混淆您可能得到的任何错误输出。

或作为heredoc:

sqlplus -l -s user/pass@dbase <<EOF
set linesize 3200
set pagesize 0
set feedback off
select myquery ;
EOF

最新更新