我的sql脚本如何确定它是在sqldeveloper还是sqlplus中运行?

时间:2013-05-16 20:31:09

标签: oracle oracle-sqldeveloper

我正在尝试通过编写我的脚本来检测它是SQL * Plus还是SQLDeveloper来解决SQLDeveloper lineize错误。类似的东西:

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的值。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

我不熟悉SQL Developer的lineize bug,所以不确定最终结果应该是什么。但您可以使用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 *中提供linesize 500,在SQL Developer中提供linesize 5


如果您在SQL * Plus中可能尚未连接,请先定义该值;您甚至不需要做任何特别的事情来隐藏select之外的set 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

我只得到这个输出:

linesize 5

同样的事情在SQL Developer中运行,再次给出{{1}}。

答案 1 :(得分:2)

您可以从v $ session

查询可执行文件名
select program from v$session where sid = sys_context('userenv','sid')
例如,

sql * plus将是sqlplus.exe

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

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