在Orcale里如何建立和使用临时表?我写了一个返回数据集的存储过程,但我不知道如何在里面建立和使用临时表?CREATE OR REPLACE PROCEDURE sp_getResult(IDvalue in integer,rst out sys_refcursor) is
begin
open rst for select * from test1 where id =IDvalue;
end;
我现在现在 sp_getResult的存储过程里建立一个临时表yy(id int,test varchar2(20)) 然后把表test1里的数据用while循环一条一条读出记录然后插入到临时表yy里,最后select * from yy列出yy表里的记录,具体代码该如何写,请高手指教,谢谢

解决方案 »

  1.   

     
    SQL> create global temporary table tmp_tb1(id number,name varchar2(10)) 
      2  on commit preserve rows
      3  /表已创建。SQL> ---会话行的,会话结束数据就清空
    SQL> create global temporary table tmp_tb2(id number,name varchar2(10))
      2  on commit delete rows
      3  /表已创建。SQL> --事件型的,事件完成就清空数据
      

  2.   

    oracle的临时表与sqlserver的临时表有很大的区别,oracle中的临时表,更象是永久表,一般在存储过程外先建立好,只不过数据是临时的,有两种:提交数据时自动清除临时数据(基于事务) ;会话结束时自动清除临时数据(基于会话)。
      

  3.   

    to wkc168 create global temporary table tmp_tb1(id number,name varchar2(10)) 
     on commit preserve rows
    以上建表的语句我知道,但是我把它加到存储过程里保存的时候就会出错,你放在命令行里是可以运行,但我需要的是放到存储过程里来实现呀!麻烦再帮看看,谢谢!CREATE OR REPLACE PROCEDURE sp_getResult(IDvalue in integer,rst out sys_refcursor) is
    begin create global temporary table tmp_tb1(id number,name varchar2(10)) 
     on commit preserve rows
    如果存储过程里加上上面这段代码就保存不了,放在命令行是可以执行的open rst for select * from test1 where id =IDvalue;
    end;
      

  4.   


      存储过程中不能直接使用DDL语句(如:create、alter等),需要转换下才能执行。
      例如:
      

  5.   

    --拼接CREATE OR REPLACE PROCEDURE sp_getResult(IDvalue in integer,rst out sys_refcursor) 
    is
    str varchar2(1000);
    begin
    str:='create global temporary table tmp_tb1(id number,name varchar2(10))  on commit preserve rows';
    execute immediate str;
    open rst for select * from test1 where id =IDvalue;
    end;
      

  6.   

    to wkc168
    str:='create global temporary table tmp_tb1(id number,name varchar2(10))  on commit preserve rows';
    execute immediate str;这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
    open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!还有如何用循环读出零时表里的数据呢?麻烦告知谢谢?
      

  7.   

    to wkc168
    str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
    execute immediate str;这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
    open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!还有如何用循环读出零时表里的数据呢?麻烦告知谢谢?
      

  8.   


    to wkc168create global temporary table tmp_tb1(id number,name varchar2(10))
    on commit preserve rows
    以上建表的语句我知道,但是我把它加到存储过程里保存的时候就会出错,你放在命令行里是可以运行,但我需要的是放到存储过程里来实现呀!麻烦再帮看看,谢谢!CREATE OR REP……
      

  9.   

    str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
    execute immediate str;这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
    open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!还有如何用循环读出零时表里的数据呢?麻烦告知谢谢? 
     
      

  10.   

    str:='create global temporary table tmp_tb1(id number,name varchar2(10)) on commit preserve rows';
    execute immediate str;这个语句我试过,但如果是用这种形式的话那在存储过程里如何应用零时表呢例如:
    open rst for select * from tmp_tb1;如果我再存储过程里写入这句的话就不法保存,提示找不到此表!还有如何用循环读出零时表里的数据呢?麻烦告知谢谢? 
      

  11.   

    ...块中不能执行DDL语句...试试动态解决你的问题