我正在尝试通过编写我的脚本来检测它是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的值。
有什么建议吗?
答案 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中执行长进程时始终设置模块/操作并且它会覆盖现有值)。
使用该程序时请记住,通过更改可执行文件名也可以轻松操作它 - 它被称为欺骗。