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怎么解决
时间: 2023-12-03 08:03:44 浏览: 149
这个错误是由于 `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` 转换为字符串,然后再进行加密操作。你可以根据实际情况修改该语句。
相关问题
UPDATE ORDERS SET TotalCost = DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(TotalCost), DBMS_CRYPTO.TYPE_AES256, UTL_RAW.CAST_TO_RAW('618272') ) WHERE TotalCost IS NOT NULL; UPDATE PRODUCT SET Price = DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(Price), DBMS_CRYPTO.TYPE_AES256, UTL_RAW.CAST_TO_RAW('618272') ) WHERE Price IS NOT NULL; UPDATE ORDERS_DETAILS SET Price = DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(Price), DBMS_CRYPTO.TYPE_AES256, UTL_RAW.CAST_TO_RAW('618272') ) WHERE Price IS NOT NULL; UPDATE TRANSACTION SET TotalAmount = DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(TotalAmount), DBMS_CRYPTO.TYPE_AES256, UTL_RAW.CAST_TO_RAW('618272') ) WHERE TotalAmount IS NOT NULL; UPDATE TRANSACTION_DETAILS SET Price = DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(Price), DBMS_CRYPTO.TYPE_AES256, UTL_RAW.CAST_TO_RAW('618272') ) WHERE Price IS NOT NULL; UPDATE SALARY SET SalaryAmount = DBMS_CRYPTO.ENCRYPT( UTL_RAW.CAST_TO_RAW(SalaryAmount), DBMS_CRYPTO.TYPE_AES256, UTL_RAW.CAST_TO_RAW('618272') ) WHERE SalaryAmount IS NOT NULL;
这是一个 SQL 查询语句,它使用 Oracle 数据库的 DBMS_CRYPTO 函数将某些列的数据进行加密。具体来说,它将订单表中的 TotalCost 列、产品表中的 Price 列、订单详情表中的 Price 列、交易表中的 TotalAmount 列、交易详情表中的 Price 列以及薪资表中的 SalaryAmount 列进行加密。
加密使用的是 AES256 算法,并且密钥为 '618272'。这意味着只有知道密钥的人才能够解密这些列的数据。这样做可以保护这些敏感数据,防止它们被未经授权的人员访问。
SQL> SQL> UPDATE TRANSACTION_DETAILS 2 SET Price = utl_raw.cast_to_varchar2(dbms_crypto.encrypt( 3 utl_i18n.string_to_raw(TO_CHAR(Price, 'FM99999990.99')||' ', 'AL32UTF8'), 4 dbms_crypto.ENCRYPT_AES256 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5, 5 utl_i18n.string_to_raw('251251', 'AL32UTF8') 6 )); dbms_crypto.ENCRYPT_AES256 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5, * ERROR at line 4: ORA-06553: PLS-221: 'ENCRYPT_AES256' is not a procedure or is undefined 怎么解决
这个错误提示是因为在第4行中,`dbms_crypto.ENCRYPT_AES256 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5`这部分代码被认为是一个过程(procedure),而实际上它是一个常量。
要解决这个问题,可以把加密算法的常量值放到一个变量中,再在UPDATE语句中使用该变量,例如:
```
DECLARE
l_algorithm PLS_INTEGER := dbms_crypto.ENCRYPT_AES256 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5;
BEGIN
UPDATE TRANSACTION_DETAILS
SET Price = utl_raw.cast_to_varchar2(dbms_crypto.encrypt(
utl_i18n.string_to_raw(TO_CHAR(Price, 'FM99999990.99')||' ', 'AL32UTF8'),
l_algorithm,
utl_i18n.string_to_raw('251251', 'AL32UTF8')
));
END;
```
在这个例子中,将加密算法常量放到了名为`l_algorithm`的变量中,然后在UPDATE语句中使用该变量。
阅读全文