未找到 From 关键字,其中 oracle 中的预期错误

From keyword not found where expected error in oracle

提问人:munia 提问时间:5/13/2022 最后编辑:jarlhmunia 更新时间:5/16/2022 访问量:147

问:

Select firstname as name, time as asof, salary as bal into temp employee
from people.person p
where p.id =1;

需要通过插入已创建的表中的值来创建临时表 person,该表属于 people 数据库,但从预期的关键字未找到错误

SQL Oracle 语法错误 关键字 执行

评论

0赞 Alex Poole 5/13/2022
into temp是 PL/SQL。您指的是一个真实的(已经存在的)临时表,还是您想从这些数据创建的表?还是 CTE,在另一份声明的持续时间内?还是别的什么?解释您计划如何使用它可能会有所帮助。
1赞 Alex Poole 5/13/2022
如果你真的想做一个临时表,那么你应该创建一个临时表,然后在每个会话中根据需要填充它()。但目前尚不清楚你真正想要实现的目标是什么。insert .... into ... select ....

答:

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 不是这样工作的。