【问题标题】:how can my sql script determine whether it is running in sqldeveloper or sqlplus?我的 sql 脚本如何确定它是在 sqldeveloper 还是 sqlplus 中运行?
【发布时间】:2013-05-17 16:11:43
【问题描述】:

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

有什么建议吗?

【问题讨论】:

    标签: oracle oracle-sqldeveloper


    【解决方案1】:

    我不熟悉 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 中连接,只需先定义值;你甚至不需要做任何特别的事情来隐藏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
    

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

    【讨论】:

    • 关闭,但是 - gaaaaa!我有一个脚本协议,其中我的脚本开始时未连接到数据库。嗯...当我通过 sqldeveloper 运行时,我已连接,所以这可以工作...但是当它开始未连接时,我需要在 SQLplus 中关闭愚蠢的东西......谢谢你,亚历克斯,你搅动了我的灰色小细胞!
    • 我给出的示例也使用了 SELECT ......我将你的标记为解决方案。再次感谢!
    • @AndrewWolfe - 你现在可能已经解决了这个问题,但我已经添加了一个调整,所以如果你还没有连接它就可以工作。
    【解决方案2】:

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

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

    sql*plus 例如将是sqlplus.exe

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

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

    【讨论】:

    • 我一般同意,但由于 SQLPlus 和 SQL Developer 表现良好,而且这显然只在脚本开头运行,我认为 module 在这种情况下是安全的.您还需要考虑program 的变化; SQL Developer 似乎总是这么说,但对于 SQLPlus,您可能会得到类似 sqlplus@myhost (TNS V1-V3) 的信息,并且可能存在平台变化。因此,可能需要进行一些解析,具体取决于您要查找的内容。
    • 谢谢,@haki,但我处于 V$SESSION 只对管理员开放的环境中。
    猜你喜欢
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多