改正:DECLARE i_key RAW(32); BEGIN i_key :=UTL_RAW.cast_to_raw('618272'); UPDATE SALARY SET SalaryAmount = DBMS_CRYPTO.ENCRYPT( src=>UTL_RAW.CAST_TO_RAW(TO_CHAR(SalaryAmount)), typ=>DBMS_CRYPTO.AES_CBC_PKCS5, key=>i_key, iv=>NULL ) WHERE SalaryAmount IS NOT NULL; END; /SELECT SalaryAmount FROM SALARY;
时间: 2023-12-06 12:43:04 浏览: 36
修改后的代码如下:
DECLARE
i_key RAW(32);
BEGIN
i_key := UTL_RAW.cast_to_raw('618272');
UPDATE SALARY
SET SalaryAmount = DBMS_CRYPTO.ENCRYPT(
src => UTL_RAW.CAST_TO_RAW(TO_CHAR(SalaryAmount)),
typ => DBMS_CRYPTO.AES_CBC_PKCS5,
key => i_key,
iv => NULL
)
WHERE SalaryAmount IS NOT NULL;
COMMIT;
SELECT DBMS_CRYPTO.DECRYPT(
src => SalaryAmount,
typ => DBMS_CRYPTO.AES_CBC_PKCS5,
key => i_key,
iv => NULL
) AS Decrypted_SalaryAmount
FROM SALARY;
END;
/
这个代码块将会将 SALARY 表中的 SalaryAmount 列进行加密,并且将其更新为加密后的值。修改后的代码添加了一个 COMMIT 语句,以确保更新操作被提交。同时,还添加了一个 SELECT 语句,用于解密 SalaryAmount 并返回其原始值。
相关问题
改正:ALTER TABLE ORDERS MODIFY TotalCost NUMBER(35,2);DECLARE i_key RAW(32); BEGIN i_key :=UTL_RAW.cast_to_raw('618272'); UPDATE ORDERS SET TotalCost = DBMS_CRYPTO.ENCRYPT( src=>UTL_RAW.CAST_TO_RAW(TotalCost), typ=>DBMS_CRYPTO.AES_CBC_PKCS5, key=>i_key, iv=>NULL ) WHERE TotalCost IS NOT NULL; END; /
修改:ALTER TABLE ORDERS MODIFY TotalCost NUMBER(35,2);
DECLARE
i_key RAW(32);
BEGIN
i_key := UTL_RAW.cast_to_raw('618272');
UPDATE ORDERS
SET TotalCost = DBMS_CRYPTO.ENCRYPT(
src => UTL_RAW.CAST_TO_RAW(TO_CHAR(TotalCost)),
typ => DBMS_CRYPTO.AES_CBC_PKCS5,
key => i_key,
iv => NULL
)
WHERE TotalCost IS NOT NULL;
END; /
这个修改过的代码将 TotalCost 列中的值进行了加密,并将其更新回数据库。在这里,我们使用 AES_CBC_PKCS5 加密算法对 TotalCost 进行加密,使用的密钥是 '618272'。注意,我们需要通过 TO_CHAR 函数将 TotalCost 转换为字符串类型,以便进行加密。
SQL> DECLARE 2 v_key RAW(32); 3 BEGIN 4 v_key := UTL_RAW.cast_to_raw('251251'); 5 UPDATE TRANSACTION_DETAILS 6 SET Price = DBMS_CRYPTO.ENCRYPT( 7 src => UTL_RAW.cast_to_raw(TO_BINARY_FLOAT(Price)), 8 typ => DBMS_CRYPTO.DES_CBC_PKCS5, 9 key => v_key, 10 iv => NULL 11 ) 12 WHERE Price IS NOT NULL; 13 END; 14 / SET Price = DBMS_CRYPTO.ENCRYPT( * ERROR at line 6: ORA-06550: line 6, column 28: PL/SQL: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY ORA-06550: line 5, column 4: PL/SQL: SQL Statement ignored 怎么解决
这个问题是因为在进行加密时,Price 列的数据类型是 NUMBER 类型,而 DBMS_CRYPTO.ENCRYPT 函数要求输入的数据类型是 RAW 类型。因此,需要将 Price 列的数据类型转换成 RAW 类型,然后再进行加密。
你可以使用 UTL_RAW.cast_to_raw 函数将 Price 列的值转换成 RAW 类型,例如:
```
DECLARE
v_key RAW(32);
BEGIN
v_key := UTL_RAW.cast_to_raw('251251');
UPDATE TRANSACTION_DETAILS
SET Price = DBMS_CRYPTO.ENCRYPT(
src => UTL_RAW.cast_to_raw(TO_BINARY_FLOAT(Price)),
typ => DBMS_CRYPTO.DES_CBC_PKCS5,
key => v_key,
iv => NULL
)
WHERE Price IS NOT NULL;
END;
/
```
在上面的代码中,使用了 TO_BINARY_FLOAT 函数将 Price 列的值转换成二进制浮点数,然后再使用 UTL_RAW.cast_to_raw 函数将其转换成 RAW 类型,以符合 DBMS_CRYPTO.ENCRYPT 函数的要求。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)