2

我正在尝试通过编写脚本来检测它是 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 的值。

有什么建议么?

4

2 回答 2

4

我不熟悉 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

它提供linesize 500了 SQL*Plus 和linesize 5SQL Developer。


如果您可能尚未在 SQL*Plus 中连接,请先定义值;你甚至不需要做任何特别的事情来隐藏错误selectset termout off尽管你可以包含一个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

如果选择成功,该column值将覆盖它,如果选择失败,则不会触及它。如果我把它放在一个名为client.sql并运行它的文件中:

sqlplus -s /nolog @client

我只得到这个输出:

linesize 500

同样的事情在 SQL Developer 中运行,linesize 5再次给出。

于 2013-05-16T22:30:21.640 回答
3

您可以从 v$session 查询可执行文件名称

select program from v$session where sid = sys_context('userenv','sid')

例如 sql*plus 将是sqlplus.exe.

@alex 的方式也不错,但是模块很容易操作,并且经常被应用程序用作在线监控工具。这就是为什么我认为不应该依赖它的原因(我个人习惯于在 pl/sql 中执行长进程时总是设置模块/操作,它会覆盖现有值)。

使用该程序时请记住,它也可以通过更改可执行文件名称轻松操纵 - 这称为欺骗。

于 2013-05-17T08:10:16.797 回答