SQL> DECLARE 2 l_key RAW(32) := utl_raw.cast_to_raw('251251'); 3 BEGIN 4 UPDATE PRODUCT SET Price = DBMS_CRYPTO.ENCRYPT( 5 src => UTL_RAW.cast_to_raw(TO_CHAR(Price, 'FM9999999999999999999999999999999990.00')), 6 typ => DBMS_CRYPTO.ENCRYPT_AES256, 7 key => l_key 8 ) WHERE Price is not null; 9 END; 10 / UPDATE PRODUCT SET Price = DBMS_CRYPTO.ENCRYPT( * ERROR at line 4: ORA-06550: line 4, column 43: PL/SQL: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY ORA-06550: line 4, column 4: PL/SQL: SQL Statement ignored怎么解决
时间: 2023-12-10 13:02:55 浏览: 41
这个错误是因为在将价格转换为 RAW 格式之前,应该先将其转换为字符串格式。你可以使用 TO_CHAR 函数将价格转换为字符串,然后再将其转换为 RAW 格式。下面是修改后的代码:
```
DECLARE
l_key RAW(32) := utl_raw.cast_to_raw('251251');
BEGIN
UPDATE PRODUCT SET Price = DBMS_CRYPTO.ENCRYPT(
src => UTL_RAW.cast_to_raw(TO_CHAR(Price, 'FM9999999999999999999999999999999990.00')),
typ => DBMS_CRYPTO.ENCRYPT_AES256,
key => l_key
) WHERE Price is not null;
END;
/
```
这样应该可以成功加密价格并更新到数据库中。
相关问题
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 函数的要求。
纠正DECLARE i_key RAW(32); BEGIN i_key :=UTL_RAW.cast_to_raw('618272'); UPDATE SALARY SET SalaryAmount = DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(SalaryAmount), DBMS_CRYPTO.AES_CBC_PKCS5, key=>i_key, iv=>NULL ) WHERE SalaryAmount IS NOT NULL; END; /
感谢您的纠正!这段代码是使用 Oracle 数据库的 DBMS_CRYPTO 包进行 AES-256-CBC 加密的 SQL 语句。下面是经过纠正的代码:
```
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(SalaryAmount),
typ => DBMS_CRYPTO.AES_CBC_PKCS5,
key => i_key,
iv => NULL
)
WHERE SalaryAmount IS NOT NULL;
END;
/
```
在 `DBMS_CRYPTO.ENCRYPT` 函数中,第一个参数是原始数据(plaintext),第二个参数是加密算法的类型(这里是 AES-256-CBC),第三个参数是加密密钥,第四个参数是初始化向量(IV),这里将 IV 设为 NULL,表示使用默认值。
需要注意的是,这段代码只是对数据库中的某个表的某个字段进行加密,并不是对整个数据库进行加密。如果需要对整个数据库进行加密,需要使用其他方法,比如 Oracle Transparent Data Encryption(TDE)。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)