提问人:munia 提问时间:5/13/2022 最后编辑:jarlhmunia 更新时间:5/16/2022 访问量:147
未找到 From 关键字,其中 oracle 中的预期错误
From keyword not found where expected error in oracle
问:
Select firstname as name, time as asof, salary as bal into temp employee
from people.person p
where p.id =1;
需要通过插入已创建的表中的值来创建临时表 person,该表属于 people 数据库,但从预期的关键字未找到错误
答:
3赞
Littlefoot
5/13/2022
#1
然后,您将使用 CTAS(将表创建为选择),而不是无效子句;它用于不同的目的。INTO
create table temp_employee as
select firstname as name,
time as asof,
salary as bal
from people.person p
where p.id = 1;
根据您发布的评论,您可能需要考虑几个选项。
一种是创建一个永久表(就像上面的例子所示)。如果要重用它,则在过程中首先删除其内容(或截断表,因为它的速度更快),然后重新填充它:
delete from temp_employee;
-- or truncate table temp_employee;
insert into temp_employee
select firstname, time, salary from people.person
where id = 1;
另一种选择是创建一个真正的临时表,例如
create global temporary table temp_employee
(name varchar2(30),
time date,
bal number
)
on commit preserve rows;
每当您需要数据时,只需插入它:
insert into temp_employee (name, time, bal)
select firstname as name,
time as asof,
salary as bal
from people.person p
where p.id = 1;
这样一来,它的内容将只对你(而对其他人)可见,而表的内容将在事务或会话期间保留(这取决于你如何创建它 - 请参阅子句)。on commit preserve/delete rows
您不应该做的是创建表,删除它,然后再次创建它,依此类推 - 在 Oracle 中,我们创建一次表并多次使用它。
评论
0赞
munia
5/13/2022
通过创建这样的表,它正在创建永久表,因此在再次执行语句时,它会抛出错误表已经存在,我需要创建临时表 employee,它将与个人表(这是一个永久表)具有相同的列。需要将此查询放在我的 python 方法中。
0赞
Ankit Bajpai
5/13/2022
@munia,您必须首先通过检查表是否存在来使用 DROP 表语法。如果它存在,则删除它,否则创建一个永久表。
0赞
Littlefoot
5/14/2022
请看一下编辑后的答案。
0赞
munia
5/14/2022
@Littlefoot,在以上述格式执行时,它会抛出缺少关键字错误。修改了查询,如下所示,它工作正常。在提交时创建全局临时表temp_employee将行保留为 select name,time as asof,salary as bal from people.person p where p.id=1 但问题是相同的,它正在创建永久表,因此当第二次执行查询时,它会抛出错误,例如名称已被现有对象使用
0赞
Littlefoot
5/15/2022
在 Oracle 中,全局临时表仍然是数据库中的“永久”对象,它不会“消失”(例如,在会话结束时)——您必须删除它。因此,是的 - 如果您尝试再次创建它,则会出现您提到的错误,因为表仍然存在。看来你不太明白我的最后一句话。不要创建/删除/创建/删除/创建/...表,Oracle 不是这样工作的。
评论
into temp
是 PL/SQL。您指的是一个真实的(已经存在的)临时表,还是您想从这些数据创建的表?还是 CTE,在另一份声明的持续时间内?还是别的什么?解释您计划如何使用它可能会有所帮助。insert .... into ... select ....