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 怎么解决
时间: 2023-12-14 20:35:52 浏览: 363
这个错误提示是因为在第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语句中使用该变量。
相关问题
CREATE TABLE CUSTOMER ( CustomerID NUMBER PRIMARY KEY, Name VARCHAR2(20), Address VARCHAR2(20), PhoneNumber VARCHAR2(20), Email VARCHAR2(30), LoyaltyStatus VARCHAR2(20) ); CREATE TABLE ORDERS ( OrderID NUMBER PRIMARY KEY, OrderDate DATE, OrderStatus VARCHAR2(20), TotalCost NUMBER, CustomerID NUMBER, CONSTRAINT FK_ORDER_CUSTOMER FOREIGN KEY (CustomerID) REFERENCES CUSTOMER(CustomerID) ); CREATE TABLE PRODUCT ( ProductID NUMBER PRIMARY KEY, ProductName VARCHAR2(20), Description VARCHAR2(20), Price NUMBER, Category VARCHAR2(20) ); CREATE TABLE ORDERS_DETAILS ( OrderDetailID NUMBER PRIMARY KEY, OrderID NUMBER, ProductID NUMBER, ProductName VARCHAR2(20), Price NUMBER, Quantity NUMBER, Subtotal NUMBER, CONSTRAINT FK_ORDER_DETAILS_ORDER FOREIGN KEY (OrderID) REFERENCES ORDERS(OrderID), CONSTRAINT FK_ORDER_DETAILS_PRODUCT FOREIGN KEY (ProductID) REFERENCES PRODUCT(ProductID) ); CREATE TABLE STORE ( StoreID NUMBER PRIMARY KEY, StoreName VARCHAR2(20), Location VARCHAR2(20), HoursOfOperation VARCHAR2(20) ); CREATE TABLE INVENTORY ( ProductID NUMBER, StoreID NUMBER, QuantityOnHand NUMBER, ReorderPoint NUMBER, PRIMARY KEY (ProductID, StoreID), CONSTRAINT FK_INVENTORY_PRODUCT FOREIGN KEY (ProductID) REFERENCES PRODUCT(ProductID), CONSTRAINT FK_INVENTORY_STORE FOREIGN KEY (StoreID) REFERENCES STORE(StoreID) ); CREATE TABLE "TRANSACTION" ( TransactionID NUMBER PRIMARY KEY, TransactionDate DATE, TransactionType VARCHAR2(20), TotalAmount NUMBER, CustomerID NUMBER, CONSTRAINT FK_TRANSACTION_CUSTOMER FOREIGN KEY (CustomerID) REFERENCES CUSTOMER(CustomerID) ); CREATE TABLE TRANSACTION_DETAILS ( TransactionDetailID NUMBER PRIMARY KEY, TransactionID NUMBER, ProductID NUMBER, ProductName VARCHAR2(20), Price NUMBER, Quantity NUMBER, Subtotal NUMBER, CONSTRAINT FK_TRANSACTION_DETAILS_TRANSACTION FOREIGN KEY (TransactionID) REFERENCES "TRANSACTION"(TransactionID), CONSTRAINT FK_TRANSACTION_DETAILS_PRODUCT FOREIGN KEY (ProductID) REFERENCES PRODUCT(ProductID) ); CREATE TABLE EMPLOYEE ( EmployeeID NUMBER PRIMARY KEY, Name VARCHAR2(20), Address VARCHAR2(20), PhoneNumber VARCHAR2(20), Email VARCHAR2(30), Position VARCHAR2(20) ); CREATE TABLE SALARY ( EmployeeID NUMBER, StartDate DATE, SalaryAmount NUMBER, EndDate DATE, PRIMARY KEY (EmployeeID, StartDate), CONSTRAINT FK_SALARY_EMPLOYEE FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEE(EmployeeID) ); CREATE TABLE SHIFT ( ShiftID NUMBER PRIMARY KEY, StartTime TIMESTAMP, EndTime TIMESTAMP, StoreID NUMBER, EmployeeID NUMBER, CONSTRAINT FK_SHIFT_EMPLOYEE FOREIGN KEY (EmployeeID) REFERENCES EMPLOYEE(EmployeeID), CONSTRAINT FK_SHIFT_STORE FOREIGN KEY (StoreID) REFERENCES STORE(StoreID) ); 用非DBMS_CRYPTO方法加密Price和PhoneNumber给出代码
对于加密 Price 和 PhoneNumber 字段,可以使用 Oracle 数据库中提供的 DBMS_CRYPTO 包进行加密,但是也可以使用其他加密算法,如 AES、RSA 等。
以下是使用 AES 加密算法进行加密的示例代码:
```sql
-- 创建密钥
DECLARE
l_key RAW(32) := UTL_RAW.cast_to_raw('mysecretkey12345');
l_iv RAW(16) := UTL_RAW.cast_to_raw('myinitialvector');
l_key_handle RAW(2000);
BEGIN
l_key_handle := DBMS_CRYPTO.create_key(
algorithm => DBMS_CRYPTO.aes256_cbc,
key_bytes => 32,
key => l_key,
iv => l_iv
);
END;
/
-- 对 Price 字段进行加密
UPDATE PRODUCT SET Price = DBMS_CRYPTO.encrypt(
utl_raw.cast_to_raw(Price),
DBMS_CRYPTO.aes256_cbc,
l_key_handle,
l_iv
);
-- 对 PhoneNumber 字段进行加密
UPDATE CUSTOMER SET PhoneNumber = DBMS_CRYPTO.encrypt(
utl_raw.cast_to_raw(PhoneNumber),
DBMS_CRYPTO.aes256_cbc,
l_key_handle,
l_iv
);
```
注意:在使用加密算法对数据进行加密时,需要确保密钥的安全性,以免密钥泄露导致数据被解密。
阅读全文
相关推荐




