Oracle
 sql >> Base de données >  >> RDS >> Oracle

comment mon script sql peut-il déterminer s'il s'exécute dans sqldeveloper ou sqlplus ?

Je ne suis pas familier avec un bogue de taille de ligne SQL Developer, donc je ne sais pas quel est le résultat final. Mais vous pouvez utiliser sys_context pour cela :

select sys_context('USERENV', 'MODULE') from dual;

Ce qui donne :

SYS_CONTEXT('USERENV','MODULE')
--------------------------------------------------------------------------------
SQL*Plus

... ou :

SYS_CONTEXT('USERENV','MODULE')                                           
-------------------------------
SQL Developer 

Vous pouvez donc adapter ce que vous avez comme :

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

Et puis testez avec

show linesize

ce qui donne linesize 500 en SQL*Plus et linesize 5 dans SQL Developer.

Si vous n'êtes peut-être pas encore connecté à SQL*Plus, définissez simplement la valeur en premier; vous n'avez même pas besoin de faire quoi que ce soit de spécial pour masquer l'erreur du select au-delà de set termout off , bien que vous puissiez inclure un whenever sqlerror juste au cas où votre login.sql est en train de le configurer pour quitter - mais vous devrez peut-être savoir le réinitialiser par la suite.

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

La column la valeur la remplacera si la sélection réussit et ne la touchera pas si elle échoue. Si je mets cela dans un fichier appelé client.sql et exécutez-le en tant que :

sqlplus -s /nolog @client

Je n'obtiens que cette sortie :

linesize 500

Et la même chose s'exécute dans SQL Developer, donnant linesize 5 à nouveau.