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
我执行以下查询,其中 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