CREATE OR REPLACE PROCEDURE ENCRYPT_PRICE AS 2 C_KEY VARCHAR2(32) := 'MY_SECRET_KEY_FOR_AES256'; 3 BEGIN 4 UPDATE PRODUCT SET PRICE = DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(TO_CHAR(PRICE), 'AL32UTF8'), 5 DBMS_CRYPTO.AES256_CBC, 6 UTL_I18N.STRING_TO_RAW(C_KEY, 'AL32UTF8'), 7 DBMS_CRYPTO.CHAIN_IV) WHERE PRICE IS NOT NULL; 8 END; 9 / Warning: Procedure created with compilation errors.错在哪里
时间: 2024-01-31 08:01:59 浏览: 86
根据你提供的代码,我无法确定具体的编译错误原因。但是,这个代码中有一个明显的问题,就是在第四行的UPDATE语句中,TO_CHAR函数可能会导致价格(PRICE)列的值被转换为字符串,这可能会导致加密失败。因此,建议你将第四行的代码更改为以下代码:
```
UPDATE PRODUCT SET PRICE = DBMS_CRYPTO.ENCRYPT(UTL_RAW.CAST_TO_RAW(TO_CHAR(PRICE)), DBMS_CRYPTO.AES256_CBC, UTL_I18N.STRING_TO_RAW(C_KEY, 'AL32UTF8'), DBMS_CRYPTO.CHAIN_IV) WHERE PRICE IS NOT NULL;
```
这样可以将价格列的值转换为RAW类型,然后进行加密。另外,你可以通过执行以下命令来查看具体的编译错误信息:
```
SHOW ERRORS;
```
这个命令可以显示编译错误的详细信息,从而帮助你找出错误所在的位置和原因。
相关问题
CREATE OR REPLACE PROCEDURE ENCRYPT_PRICE AS 2 C_KEY VARCHAR2(32) := 'MY_SECRET_KEY_FOR_AES256'; 3 BEGIN 4 UPDATE PRODUCT SET PRICE = DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(TO_CHAR(PRICE), 'AL32UTF8'), 5 DBMS_CRYPTO.AES256_CBC, 6 UTL_I18N.STRING_TO_RAW(C_KEY, 'AL32UTF8'), 7 DBMS_CRYPTO.CHAIN_IV) WHERE PRICE IS NOT NULL; 8 END; 9 / Warning: Procedure created with compilation errors.报错
根据你提供的代码,我可以看到编译错误的提示信息。这个错误可能是语法错误或者其他问题导致的。你可以尝试使用以下命令来获取更详细的错误信息:
```
SHOW ERRORS;
```
这个命令可以显示编译错误的详细信息,从而帮助你找出错误所在的位置和原因。如果你还有其他问题,请告诉我。
SQL> CREATE OR REPLACE PROCEDURE ENCRYPT_PRICE AS 2 C_KEY VARCHAR2(32) := 'MY_SECRET_KEY_FOR_AES256'; 3 BEGIN 4 UPDATE PRODUCT SET PRICE = DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(TO_CHAR(PRICE), 'AL32UTF8'), 5 DBMS_CRYPTO.AES256_CBC, 6 UTL_I18N.STRING_TO_RAW(C_KEY, 'AL32UTF8'), 7 DBMS_CRYPTO.CHAIN_IV) WHERE PRICE IS NOT NULL; 8 END; 9 / Warning: Procedure created with compilation errors.
这个程序创建时出现了编译错误,可能是语法错误或其他问题导致的。你可以使用以下命令查询编译错误:
```
SHOW ERRORS;
```
这将显示最近一次编译错误的详细信息,包括错误行数、错误类型和错误消息。
在这种情况下,可能是因为 `DBMS_CRYPTO.AES256_CBC` 不被识别为有效的加密类型。你可以使用 `DBMS_CRYPTO.ENCRYPT_AES256` 替换 `DBMS_CRYPTO.AES256_CBC`,因为后者是前者的一部分。修改后的代码如下:
```
CREATE OR REPLACE PROCEDURE ENCRYPT_PRICE AS
C_KEY VARCHAR2(32) := 'MY_SECRET_KEY_FOR_AES256';
BEGIN
UPDATE PRODUCT SET PRICE = DBMS_CRYPTO.ENCRYPT(
UTL_I18N.STRING_TO_RAW(TO_CHAR(PRICE), 'AL32UTF8'),
DBMS_CRYPTO.ENCRYPT_AES256 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5,
UTL_I18N.STRING_TO_RAW(C_KEY, 'AL32UTF8'),
DBMS_CRYPTO.CHAIN_IV
) WHERE PRICE IS NOT NULL;
END;
/
阅读全文