【问题标题】:Select into a temporary table in Oracle选择到Oracle中的临时表
【发布时间】:2015-04-23 13:35:15
【问题描述】:

我正在尝试执行以下操作,

select * into temp from (select * from student);

它给了我以下错误,

ERROR at line 1:
ORA-00905: missing keyword

在我的真实示例中,子查询(从学生中选择 *)更复杂。

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

【问题讨论】:

  • 我对这个答案投了赞成票,因为在 SQL Server 中可能会发生这样的事情:将结果集选择到不存在的表中,从而创建一个临时表。例如> SELECT * INTO #TEMP FROM STUDENT
  • 你不是select into Oracle 中的一个表,你是insert into 它。 select into 构造用于填充变量。不幸的是,其他供应商对不相关的东西有类似的语法。

标签: oracle plsql sqlplus


【解决方案1】:

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

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;

【讨论】:

    【解决方案2】:

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

     CREATE TABLE temp as
        SELECT * FROM student;
    

    【讨论】:

    • 这张表temp并不是真正的临时表,而是真正的物理表/
    【解决方案3】:

    您不会“选择”到临时表中。如果要从选择的结果中插入临时表:

    insert into temp
    select * from student;
    

    【讨论】:

    • 第 1 行出现错误:ORA-00942:表或视图不存在
    • 您必须先创建临时表,就像 oracle 中的任何其他表一样。如果你想基于一个选择创建一个表,那么使用“create table xxx as select ...”但是这只能做一次。
    • 我不想要这张桌子。为我需要的每个临时变量创建表本身的编码成本很高。我只是想要一些动态的东西,我可以在存储过程中随时填写。并且在存储过程终止后,摆脱它。但我不确定在 Oracle 中是否可行。
    • 嗯,这不是我理解问题的方式。如果你需要一个临时结构来在 pl/sql 中存储东西,你可以使用 pl/sql 集合(不幸的是也称为表)见here
    • 为了清楚起见,我建议花一些时间阅读文档。
    【解决方案4】:

    我发现这个很有用:

    CREATE GLOBAL TEMPORARY TABLE MY_TEMPORARY_TABLE ON COMMIT PRESERVE ROWS AS (
        SELECT * FROM MY_TABLE WHERE MY_CONDITION
    ) 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多