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. SQL> SHOW ERRORS; Errors for PROCEDURE ENCRYPT_PRICE: LINE/COL -------------------------------------------------------------------------------- ERROR -------------------------------------------------------------------------------- 4/3 PL/SQL: SQL Statement ignored 4/30 PL/SQL: ORA-00904: "DBMS_CRYPTO"."ENCRYPT": invalid identifier
时间: 2023-08-15 14:13:42 浏览: 47
根据你提供的错误信息,问题在于 DBMS_CRYPTO.ENCRYPT 函数被识别为无效标识符。这可能是因为你的数据库版本不支持 DBMS_CRYPTO 包中的加密函数。请确保你的 Oracle 数据库版本支持 DBMS_CRYPTO 包中的加密函数。
如果你的数据库版本支持 DBMS_CRYPTO 包中的加密函数,那么可能是该包没有被正确授权或安装。你可以尝试使用以下命令来检查 DBMS_CRYPTO 包是否存在:
```
SELECT * FROM all_objects WHERE object_name LIKE 'DBMS_CRYPTO';
```
如果该包不存在,请尝试使用以下命令来安装该包:
```
@?/rdbms/admin/dbmscrypto.sql
```
如果安装成功后仍然存在问题,请确保你的数据库用户具有执行该包中函数的权限。
相关问题
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;
/
CREATE OR REPLACE FUNCTION encrypt_number(p_num NUMBER, p_key VARCHAR2)
该函数用于加密一个数字,需要传入两个参数:要加密的数字和密钥。以下是一个可能的实现:
```
CREATE OR REPLACE FUNCTION encrypt_number(p_num NUMBER, p_key VARCHAR2)
RETURN RAW
IS
v_num_raw RAW(8);
v_key_raw RAW(32);
BEGIN
-- 将数字转换为 RAW 格式,方便加密
v_num_raw := UTL_RAW.CAST_TO_RAW(p_num);
-- 将密钥转换为 RAW 格式,方便加密
v_key_raw := UTL_RAW.CAST_TO_RAW(p_key);
-- 使用 AES256 算法加密数字
RETURN DBMS_CRYPTO.ENCRYPT(
src => v_num_raw,
typ => DBMS_CRYPTO.TYPE_AES256,
key => v_key_raw
);
END;
```
该函数使用了 Oracle 数据库提供的 DBMS_CRYPTO 包来加密数字。具体来说,它将数字和密钥都转换为 RAW 格式,然后使用 AES256 算法进行加密,并返回加密后的结果。注意,函数返回的是一个 RAW 类型的值,如果需要将其转换为其他类型(如字符串或数字),需要使用 Oracle 数据库提供的相应函数进行转换。
相关推荐
![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)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)