我正在尝试通过编写我的脚本来检测它是 SQL*Plus 还是 SQLDeveloper 来解决 SQLDeveloper linesize 错误。像这样的东西:
COLUMN SET_THE_LINE new_value TARGETLINESIZE noprint
SELECT DECODE ('&&_SQLPLUS_RELEASE.','',5,500) as SET_THE_LINE from dual;
SET LINESIZE &&TARGETLINESIZE
我知道 SQL*Plus 总是设置 _SQLPLUS_RELEASE 的值,可以理解,SQLDeveloper 不会。
不幸的是,SQLDeveloper 总是提示输入 _SQLPLUS_RELEASE 的值。
有什么建议吗?
最佳答案
我不熟悉 SQL Developer 的 linesize 错误,所以不确定最终结果应该是什么。但是你可以使用 sys_context
为此:
select sys_context('USERENV', 'MODULE') from dual;
给出:
SYS_CONTEXT('USERENV','MODULE')
--------------------------------------------------------------------------------
SQL*Plus
...或者:
SYS_CONTEXT('USERENV','MODULE')
-------------------------------
SQL Developer
因此您可以将现有的调整为:
column set_the_line new_value targetlinesize noprint
set termout off
select case sys_context('USERENV', 'MODULE')
when 'SQL Developer' then 5 else 500 end as set_the_line from dual;
set termout on
set linesize &&targetlinesize
然后测试
show linesize
它在 SQL*Plus 中给出 linesize 500
,在 SQL Developer 中给出 linesize 5
。
如果您在 SQL*Plus 中可能尚未连接,请先定义值;除了 set termout off
之外,你甚至不需要做任何特殊的事情来隐藏 select
的错误,尽管你可以包含一个 whenever sqlerror
以防万一你的 login.sql
将它设置为退出 - 但你可能必须知道之后要重置它。
define targetlinesize=500
whenever sqlerror continue
set termout off
column set_the_line new_value targetlinesize noprint
select case sys_context('USERENV', 'MODULE')
when 'SQL Developer' then 5 else 500 end as set_the_line from dual;
set termout on
set linesize &&targetlinesize
show linesize
如果选择成功,列
值将覆盖它,如果选择失败则不会触及它。如果我把它放在一个名为 client.sql
的文件中并运行它:
sqlplus -s /nolog @client
我只得到这个输出:
linesize 500
同样的事情在 SQL Developer 中运行,再次给出 linesize 5
。
关于oracle - 我的 sql 脚本如何确定它是在 sqldeveloper 还是 sqlplus 中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16596918/