vendredi 8 avril 2011

SQLPLUS: NEW_VALUE

Lorsque vous écrivez des scripts sous SQLPLUS vous pouvez utiliser la commande NEW_VALUE pour stocker la valeur d'une colonne dans une variable SQLPLUS.
La commande de raccourci est NEW_V.

Exemple:
SQL> col instance_name NEW_V inst_name
SQL> select instance_name from v$instance;

INSTANCE_NAME
----------------
orcl11

SQL> select instance_number from v$instance where instance_name='&inst_name';
old   1: select instance_number from v$instance where instance_name='&inst_name'
new   1: select instance_number from v$instance where instance_name='orcl11'

INSTANCE_NUMBER
---------------
              1

Si la requête retourne plusieurs lignes alors c'est la dernière valeur qui sera sauvergardée dans la variable:
SQL> col table_name NEW_V t_name
SQL> select table_name from user_tables where rownum<=3;

TABLE_NAME
------------------------------
ICOL$
CON$
UNDO$

SQL> prompt &t_name
UNDO$

2 commentaires:

  1. ce qui n'est pas trop connu, c'est new_value avec no rows selected.
    SQL> col x new_v x
    SQL> def x
    SP2-0135: symbol x is UNDEFINED
    SQL> select 1 x from dual where 1=0;
    no rows selected
    SQL> def x
    DEFINE X = "" (CHAR)


    Avec la condition 1=0, la valeur de x est quand même initialisée à null.

    C'est assez génial comme technique pour les paramètres "optionels"

    ex: script x.sql
    set ver off termout off pages 50000
    col null new_v 1
    select null from dual where 1=0;
    set termout on
    select username, account_status from dba_users where username='&1' or '&1' is null;


    Après, tu peux appeler le script sans paramètre sans que sqlplus ne réclame pour Enter value for 1:
    Ex:


    $ sqlplus -s / as sysdba @x SYSTEM

    USERNAME ACCOUNT_STATUS
    ------------------------------ --------------------------------
    SYSTEM OPEN

    $ sqlplus -s / as sysdba @x

    USERNAME ACCOUNT_STATUS
    ------------------------------ --------------------------------
    SCOTT OPEN
    ORACLE_OCM EXPIRED & LOCKED
    DIP EXPIRED & LOCKED
    DBSNMP OPEN
    CTXSYS OPEN
    WMSYS EXPIRED & LOCKED
    APPQOSSYS EXPIRED & LOCKED
    SYS OPEN
    SYSTEM OPEN
    OUTLN EXPIRED & LOCKED

    RépondreSupprimer
  2. Effectivement ça peut s'avérer utile.
    merci Laurent

    RépondreSupprimer