Oracle
 sql >> Database >  >> RDS >> Oracle

come può il mio script sql determinare se è in esecuzione in sqldeveloper o sqlplus?

Non ho familiarità con un bug di dimensione lineare dello sviluppatore SQL, quindi non sono sicuro di quale dovrebbe essere il risultato finale. Ma puoi usare sys_context per questo:

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

Che dà:

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

... oppure:

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

Quindi puoi adattare ciò che hai come:

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

E poi prova con

show linesize

che dà linesize 500 in SQL*Plus e linesize 5 in SQL Developer.

Se potresti non essere ancora connesso in SQL*Plus, definisci prima il valore; non devi nemmeno fare nulla di speciale per nascondere l'errore da select oltre il set termout off , anche se potresti includere un whenever sqlerror nel caso in cui il tuo login.sql lo sta impostando per uscire, ma forse devi sapere per ripristinarlo in seguito.

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 value lo sovrascriverà se la selezione ha esito positivo e non lo toccherà se fallisce. Se lo metto in un file chiamato client.sql ed eseguilo come:

sqlplus -s /nolog @client

Ottengo solo questo output:

linesize 500

E la stessa cosa viene eseguita in SQL Developer, fornendo linesize 5 di nuovo.