2010-08-03 12 views
2

Dans l'exemple suivant,l'accès à une variable de liaison dans sqlplus

variable recordId number; 

BEGIN 
    SELECT MAX(recordvalue) 
    INTO recordId 
    FROM sometable; 
END; 

PRINT recordid; 
SELECT * 
    FROM someothertable 
WHERE recordkey = &recordId; 

L'instruction select sur la dernière ligne ne peut pas accéder à la valeur de recordId. Je sais que je peux accéder à recordId à l'intérieur du bloc pl/sql en utilisant: recordId mais y a-t-il un moyen d'accéder à recordId dans une instruction sql qui n'est pas dans un bloc pl/sql? (comme dans la dernière ligne).

+0

Pourquoi voudriez-vous faire plus d'opérations en dehors de la portée du bloc PLSQL anonyme? –

+0

Vous pouvez également utiliser des variables de liaison dans SQL * Plus, toujours sous la forme ': recordId'. La version '&' demandera une valeur, et n'a pas de relation directe avec la version 'variable'. Je ne sais pas exactement pourquoi vous voudriez mélanger et assortir comme ceci cependant. –

Répondre

7

Vous pouvez également utiliser des variables de liaison dans SQL * Plus, toujours sous :recordId. La version & demandera une valeur et n'a aucune relation directe avec la version variable.

variable recordId number; 

BEGIN 
    SELECT MAX(recordvalue) 
    INTO :recordId 
    FROM sometable; 
END; 
/

PRINT recordid; 

SELECT * 
FROM someothertable 
WHERE recordkey = :recordId; 

La manière un peu plus commun pour affecter des valeurs à lier des variables est avec exec :recordId := value;, mais exec est vraiment juste un raccourci pour un bloc anonyme de toute façon.

Je ne sais pas pourquoi vous voudriez mélanger et assortir comme ceci cependant. Si l'intention est d'utiliser le résultat d'une requête dans une version ultérieure, vous pouvez essayer new_value à la place:

column x_val new_value y_val; -- could also noprint if you do not need to see the intermediate value 

SELECT MAX(recordvalue) x_val 
FROM sometable; 

SELECT * 
FROM someothertable 
WHERE recordkey = &y_val;