选择Oracle中的临时表

Sai*_*ait 13 oracle plsql sqlplus

我想尝试做以下事情,

select * into temp from (select * from student);
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误,

ERROR at line 1:
ORA-00905: missing keyword
Run Code Online (Sandbox Code Playgroud)

在我的实例中,子查询(select*from student)更复杂.

我想在存储过程中使用它,所以我不想创建表本身.我只是想通过使用临时表使我的代码更具可读性.

Mar*_*ina 10

那么也许你需要做这样的事情:

declare
   type t_temp_storage is table of student%rowtype;
   my_temp_storage t_temp_storage;
begin
   select * bulk collect into my_temp_storage from student;
   for i in 1..my_temp_storage.count
    loop
    dbms_output.put_line('here I am '||my_temp_storage(i).stuid);
   end loop; 
 end;
Run Code Online (Sandbox Code Playgroud)


小智 8

如果表temp不存在,则必须创建它.

 CREATE TABLE temp as
    SELECT * FROM student;
Run Code Online (Sandbox Code Playgroud)

  • 这个表`temp`实际上不是一个临时表,而是一个真正的物理表/ (3认同)

Die*_*tto 5

我发现这个很有用:

CREATE GLOBAL TEMPORARY TABLE MY_TEMPORARY_TABLE ON COMMIT PRESERVE ROWS AS (
    SELECT * FROM MY_TABLE WHERE MY_CONDITION
) 
Run Code Online (Sandbox Code Playgroud)

ON COMMIT PRESERVE ROWS 子句会覆盖默认子句 (ON COMMIT DELETE ROWS)。如果保留默认值,记录将在每次提交时删除,因此如果您使用自动提交客户端,记录将在创建后立即删除。无论如何,在这两种情况下,表仅在会话期间存在。


Old*_*mer 3

您不会“选择”临时表。如果您想将选择结果插入到临时表中:

insert into temp
select * from student;
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这不是我理解这个问题的方式。如果您需要一个临时结构来存储 pl/sql 中的内容,您可以使用 pl/sql 集合(不幸的是也称为表)请参阅[此处](https://docs.oracle.com/database/121/LNPLS/composites)。 htm#LNPLS005) (6认同)
  • 我不想占桌子。为我需要的每个临时变量创建表本身的编码成本很高。我只是想要一些动态的东西,我可以在存储过程中随时填充。存储过程终止后,将其删除。但我不确定在Oracle中是否可能。 (5认同)
  • 您必须首先创建临时表,就像 Oracle 中的任何其他表一样。如果你想基于select创建一个表,那么使用“create table xxx as select ...”但这只能完成一次。 (3认同)
  • 为了清楚起见,我建议花一些时间阅读文档。 (3认同)