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

SQL*Plus how to execute environment set-up and query in one statement

我执行以下查询,其中 returns 一个值并且它工作正常。

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抑制横幅;根据您使用的 head/tail 值,我想您已经拥有了它,只是没有显示出来。 (我通常也会输入 -l,这样即使凭据错误也不会卡住。)其他 set 命令会删除列标题和“已选择 1 行”。留言。

虽然总的来说这是一个较长的单一命令行,但它的优点是不会 manipulating/mangling 您可能会得到任何错误输出。

或作为 heredoc:

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