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; / 出现了 SET TotalCost = DBMS_CRYPTO.ENCRYPT( * ERROR at line 7: ORA-06550: line 7, column 32: PL/SQL: ORA-00932: inconsistent datatypes: expected NUMBER got BINARY ORA-06550: line 6, column 4: PL/SQL: SQL Statement ignored
时间: 2023-12-03 09:45:49 浏览: 140
alter table 2.zip_ALTER_Table_csharp_sql
这个错误是因为在 UPDATE 语句中,你试图将加密后的二进制数据存储到 TotalCost 这个 NUMBER 类型的列中,这是不允许的,因为数据类型不一致。你需要将加密后的二进制数据转换为一个可以存储的格式,例如 BASE64 编码,然后将它存储到一个 VARCHAR2 类型的列中。修改代码如下:
```
ALTER TABLE ORDERS MODIFY TotalCost NUMBER(35,2);
DECLARE
i_key RAW(32);
v_encrypted_raw RAW(2000);
v_encrypted_base64 VARCHAR2(4000);
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;
COMMIT;
SELECT DBMS_CRYPTO.encode(v_encrypted_raw, 64) INTO v_encrypted_base64 FROM DUAL;
END;
/
```
注意,这里我添加了两个变量 v_encrypted_raw 和 v_encrypted_base64,分别用于存储加密后的二进制数据和 BASE64 编码后的数据。在 UPDATE 完成之后,我使用 DBMS_CRYPTO.encode 函数将加密后的二进制数据转换为 BASE64 编码,并将结果存储到 v_encrypted_base64 变量中。你可以将 v_encrypted_base64 存储到一个 VARCHAR2 类型的列中。
阅读全文