UPDATE TRANSACTION_DETAILS SET Price = DBMS_CRYPTO.ENCRYPT( * ERROR at line 4: ORA-06550: line 4, column 55: PL/SQL: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY ORA-06550: line 4, column 4: PL/SQL: SQL Statement ignored怎么解决
时间: 2023-12-10 10:42:01 浏览: 86
这个错误通常是因为在对二进制数据进行加密时,加密后的结果数据类型与表中原来的数据类型不一致所导致的。可以尝试将加密后的结果转换为原来数据类型的格式,例如:
```
UPDATE TRANSACTION_DETAILS SET Price = CAST(DBMS_CRYPTO.ENCRYPT(TO_NUMBER(Price), 2, utl_raw.cast_to_raw('secret_key')) AS BLOB);
```
这里的 `TO_NUMBER` 函数将原来的二进制数据转换为数字类型,然后再将加密后的结果转换为 `BLOB` 类型,与原来的数据类型一致。`secret_key` 是加密时使用的密钥,需要根据实际情况进行修改。
相关问题
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 函数的要求。
SQL> UPDATE TRANSACTION_DETAILS SET Price = dbms_crypto.encrypt(utl_i18n.string_to_raw(Price||' ', 'AL32UTF8'), 2, utl_i18n.string_to_raw('251251', 'AL32UTF8')); UPDATE TRANSACTION_DETAILS SET Price = dbms_crypto.encrypt(utl_i18n.string_to_raw(Price||' ', 'AL32UTF8'), 2, utl_i18n.string_to_raw('251251', 'AL32UTF8')) * ERROR at line 1: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY怎么解决
这个错误是由于 `Price` 字段的数据类型不是 `NUMBER`,而是二进制类型导致的。
你需要先将 `Price` 转换为 `NUMBER` 类型,然后再进行加密操作。你可以尝试下面的 SQL 语句:
```
UPDATE TRANSACTION_DETAILS SET Price = dbms_crypto.encrypt(utl_i18n.string_to_raw(to_char(Price)||' ', 'AL32UTF8'), 2, utl_i18n.string_to_raw('251251', 'AL32UTF8'));
```
这里使用了 `to_char()` 函数将 `Price` 转换为字符串,然后再进行加密操作。你可以根据实际情况修改该语句。
阅读全文