2009-10-15 67 views
0

考慮:
甲骨文10.2克是數據庫
我有一個名爲emp表。
emp有一個名爲SECRET的VARCHAR2列。
SECRET可能包含一個明文字符串,或者它可能包含一個加密字符串,但我可以區分另一個
一個稱爲DECRYPT的函數已經存在,在給定加密字符串的情況下,將返回一個未加密的字符串。修改一個Oracle REF CURSOR

如何編寫一個函數,該函數將返回一個始終包含SECRET列中的未加密字符串的ref_cursor?

我正在用僞要找的是:

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 

從本質上講就是我想要做的是修改一個指針返回之前。但是,我不認爲這是可能的。

我的第一個想法是建立一個遊標%ROWTYPE的關聯數組。沒關係。我可以做到這一點。但是,我找不到一種將關聯數組作爲refcursor返回的方法。

對策略有什麼想法?

+1

如果「SECRET」列可能包含明文或加密數據,爲什麼DECRYPT函數不包含如果提供的值未加密則不會嘗試解密的邏輯? – 2009-10-15 05:38:12

回答

2

創建一個「is_encrypted」函數,該函數在字符串被加密後返回,然後使用case語句通過解密函數返回解密值,或者直接從表格中取出。

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

或作爲問題提出的意見,只是改變了解密功能,因此如果通過非加密的字符串,它只是返回它傳遞的字符串。