2009-10-15 6 views
0

Soit:
Oracle 10.2g est la base de données
J'ai une table appelée emp.
emp a une colonne VARCHAR2 appelée SECRET. SECRET peut contenir une chaîne en clair, ou il peut contenir une chaîne cryptée, mais je peux distinguer l'un de l'autre
Une fonction appelée DECRYPT existe déjà qui, étant donné la chaîne cryptée, retournera une chaîne non cryptée.Modification d'un curseur Oracle Ref

Comment écrire une fonction qui retournera un ref_cursor qui contient toujours une chaîne non cryptée dans la colonne SECRET?

Ce que je cherche en est pseudocode:

use a cursor to get all the rows of emp 
    for each row in emp 
    see if SECRET is encrypted 
    if yes, decrypt and store the unencrypted value back into SECRET 
    if no, leave the row untouched 
    return the cursor as a ref_cursor 

Essentiellement ce que je veux faire est de modifier un refcursor avant qu'il ne soit retourné. Cependant, je ne pense pas que ce soit possible.

Ma première pensée a été de construire un tableau associatif de curseur% ROWTYPE. C'est très bien. Je peux le faire. Cependant, je ne peux pas trouver un moyen de retourner un tableau associatif en tant que refcursor.

Des idées sur une stratégie?

+1

Si la colonne 'SECRET' peut contenir du texte en clair ou des données cryptées, pourquoi la fonction DECRYPT ne contient-elle pas la logique de ne pas tenter le décryptage si la valeur fournie n'est pas cryptée? –

Répondre

2

Créez une fonction "is_encrypted" qui retourne si la chaîne est cryptée, puis utilisez une instruction case pour renvoyer la valeur déchiffrée soit via la fonction decrypt, soit tout droit sortie de la table.

select case 
     when is_encrypted(secret) = 'Y' then decrypt(secret) 
     else secret end as ecrypted_secret 
from emp 

Ou comme suggéré dans les commentaires de question, il suffit de changer la fonction Décrypter si son passé une chaîne non cryptée, il retourne simplement la chaîne qu'il a été adopté.

Questions connexes