SQL> CREATE TEMPORARY TABLE temp_product AS SELECT CAST(Price AS VARCHAR(50)) AS Price_str FROM PRODUCT; CREATE TEMPORARY TABLE temp_product AS SELECT CAST(Price AS VARCHAR(50)) AS Price_str FROM PRODUCT * ERROR at line 1: ORA-14459: missing GLOBAL keyword怎么解决
时间: 2023-12-10 17:42:17 浏览: 133
在 Oracle 数据库中,如果要创建一个临时表,需要在 CREATE TABLE 语句中加上 GLOBAL 关键字,否则会出现 ORA-14459 错误。因此,正确的语法应该是:
```
CREATE GLOBAL TEMPORARY TABLE temp_product AS
SELECT CAST(Price AS VARCHAR(50)) AS Price_str FROM PRODUCT;
```
注意,在创建临时表时,需要指定表名、列名和数据类型,这里我假设你已经确定好了。另外,临时表在会话结束时自动被删除,不需要手动删除。
相关问题
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; 改正
以下是修正后的 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`。
ALTER TABLE PRODUCT MODIFY Price NUMBER(35,2); 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; 改正
这段 SQL 语句有一些错误,以下是修正后的代码:
```
ALTER TABLE PRODUCT MODIFY Price NUMBER(35,2);
CREATE GLOBAL TEMPORARY TABLE temp_product AS SELECT Price FROM PRODUCT;
UPDATE temp_product SET Price = encrypt_aes(CAST(Price AS VARCHAR(50)), '251251');
UPDATE PRODUCT p SET p.Price = (SELECT decrypt_aes(t.Price, '251251') FROM temp_product t WHERE t.Price = p.Price);
DROP TABLE temp_product;
```
修正后的代码将原来的 Price 列保存在临时表 temp_product 中,然后对 Price 列进行加密,最后将加密后的结果更新回 PRODUCT 表的 Price 列。同时,需要使用 decrypt_aes 函数来解密 Price 列的值。最后,删除临时表 temp_product。
阅读全文