CREATE GLOBAL TEMPORARY TABLE temp_product AS SELECT CAST(Price AS VARCHAR(50)) AS Price_str FROM PRODUCT; UPDATE temp_product SET Price_aes = encrypt_aes(Price_str, '251251'); UPDATE PRODUCT p SET Price = ( SELECT Price_aes FROM temp_product t WHERE CAST(t.Price_str AS NUMBER(35,2)) = p.Price ); DROP TEMPORARY TABLE temp_product; 改正
时间: 2023-12-10 22:42:22 浏览: 75
以下是修正后的 SQL 语句:
```
CREATE GLOBAL TEMPORARY TABLE temp_product (Price_str VARCHAR(50), Price_aes VARCHAR(200)) ON COMMIT PRESERVE ROWS;
INSERT INTO temp_product (Price_str, Price_aes)
SELECT CAST(Price AS VARCHAR(50)), encrypt_aes(CAST(Price AS VARCHAR(50)), '251251') FROM PRODUCT;
UPDATE PRODUCT p SET Price = (SELECT CAST(decrypt_aes(t.Price_aes, '251251') AS NUMBER(35,2)) FROM temp_product t WHERE CAST(t.Price_str AS NUMBER(35,2)) = p.Price);
DROP TABLE temp_product;
```
修改的地方:
1. 创建临时表时加上了 `Price_aes` 字段;
2. 将 `CREATE GLOBAL TEMPORARY TABLE` 后面的 `AS SELECT` 改为了 `(Price_str VARCHAR(50), Price_aes VARCHAR(200)) ON COMMIT PRESERVE ROWS;`,指定了临时表的结构;
3. 将原来的 `UPDATE` 语句改为了 `INSERT INTO`,将加密后的价格插入到临时表中;
4. 修改 `UPDATE` 语句中的 `SET Price_aes` 为 `SET Price`,因为现在是要更新原表中的价格;
5. 在更新原表价格时,先将临时表中的 `Price_aes` 解密,再将结果转成 `NUMBER(35,2)` 类型与原表中的价格做比较;
6. 修改 `DROP TEMPORARY TABLE` 为 `DROP TABLE`,因为 `GLOBAL TEMPORARY TABLE` 是在数据库中可见的,不需要加上 `TEMPORARY`。
阅读全文