能象SQL那样做吗?比如 
select *
into #b
from a
where nm='obj'

解决方案 »

  1.   

    先建好临时表,
    然后再向临时表insert
    和SQL server不一样,
    SQL server 还可以
    declare @t table(idx int);
    呢。
    Oracle 临时表万不得已,
    我一般不用它
      

  2.   

    SQL的临时表是存在内存中的,
    而oracle的temporary table则是在数据库中存在的表,创建时可能指定不同属性.
      

  3.   

     ORACLE的临时表在应用系统中有很大的作用,它可以让用户只能够操作各自的数据中而互不干扰,不用担心会破坏或影响其他SESSION/TRANSACTION的数据,这也是数据安全的一种解决方法    临时表分为SESSION、TRANSACTION两种,SESSION级的临时表数据在整个SESSION都存在,直到结束此次SESSION;而TRANSACTION级的临时表数据在TRANACTION结束后消失,即COMMIT/ROLLBACK或结束SESSION都会清除TRANACTION临时表数据。    两种临时表的语法:    create global temporary table 临时表名 on commit preserve|delete rows
        用preserve时就是SESSION级的临时表,用delete就是TRANSACTION级的临时表    例:1、SESSION级临时表    --建立临时表create global temporary table temp_tbl(col_a varchar2(30))
        on commit preserve rows     --插入数据    insert into temp_tbl values('test session table')    --提交 commit    --查询数据    select *from temp_tbl    可以看到数据'test session table'记录还在    --结束SESSION,重新登录,再查询数据select *from temp_tbl,这时候记录已不存在,因为系统在结束SESSION时自动清除记录    2、TRANSACTION级临时表    --建立临时表create global temporary table temp_tbl(col_a varchar2(30))
    on commit delete rows    --插入数据    insert into temp_tbl values('test transaction table')    --提交
        commit
        --查询数据    select *from temp_tbl    这时候可以看到刚才插入的记录'test transaction table'已不存在了;同样,如果不提交而直接结束SESSION,重新登录记录也不存在。
      

  4.   

    oracle中有这种:create table x as select * from table_name;但是这个就不是临时表了
      

  5.   

    如何创建呢?又如何判断库里面是否存在该临时表呢?
    我是要两个表的数据合成一个表呀?不得不用临时表?又不是很熟悉ORACLE,是否还有好的办法可以实现?请高手指点.谢谢
      

  6.   

    使用视图:
    create view as select ...;
      

  7.   

    --给个存储过程中使用临时表的例子,看一下:create table SSS
    (
      ID     NUMBER,
      VALUE1 NUMBER
    )insert into sss values(1,2);CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS
    BEGIN
      execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON  COMMIT  DELETE ROWS ';  execute immediate 'insert into AAA SELECT * FROM sss';  OPEN PO_RESULT FOR 'select * from AAA';
    END BBBB;
      

  8.   

    你好,看了你给的存储过程,我正是想把某些查询结果存到临时表里(想建立三个这样的临时表),但是可以不显示出来,然后再用SQL语句把这些表联合查询成一张表,
    现在关键是临时表不熟悉,有几个问题想问:
    1,临时表跟SQL2000一样吗?是不是会话结束就自动在数据库里消失?
    2,这几个临时表是作为最后查询用的,也就是说最后一步是再用SQL语句在这几张临时表里查询出结果并显示出来的,临时表的作用只是插入数据,你存储过程的
      语句"OPEN PO_RESULT FOR 'select * from AAA';" 是否可以不用要?
    3,在Delphi里如何调用这个存储过程,解决这几个问题马上结贴,谢谢
      

  9.   

    1.ON  COMMIT  DELETE ROWS 已经声明了临时表存在的scope
    2.可以不要呀,存储过程中参数声明为out[CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR)]
    代表作为返回参数用,他主要是为了保存结果,以便以后调用。如果是in的话就只可以传参用了。
    3.delphi中调用存储过程,我不晓得你是用什么连接的.如果采用ADO方式。直接可以用ADOStoredProc控件。procedure TForm1.Button1Click(Sender: TObject);
    begin  
     ADOStoredProc1.Close;
     DataSource1.DataSet:=ADOStoredProc1;
     ADOStoredProc1.ProcedureName:='BBBB;
     ADOStoredProc1.Parameters.Refresh;
     ADOStoredProc1.Parameters[1].Value:=XXX;--随便赋值,因为改参数他的过程中没用
     ADOStoredProc1.Open;
    end;
      

  10.   

    我的SQL语句带有参数,比如时间参数,需要在Delphi在运行时在输入参数,这时怎么改过程以及调用?CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS
    BEGIN
      execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON  COMMIT  DELETE ROWS ';  execute immediate 'insert into AAA SELECT * FROM sss';  OPEN PO_RESULT FOR 'select * from AAA';
    END BBBB;
    以BlueskyWide 提供的过程为例,具体如下:
    假设我的sss表有时间字段TM,那么我需要插入AAA表时需要时间范围,即语句'insert into AAA SELECT * FROM sss where TM>=t1 and TM<=t2';
    这里t1,t2 是在程序运行时才输入的,我用Delphi+ORACLE,  这时如何修改过程及调用,哪个请教以下   ------------>此题再加50分,解决了马上结贴
      

  11.   

    我的SQL语句带有参数,比如时间参数,需要在Delphi在运行时在输入参数,这时怎么改过程以及调用?CREATE OR REPLACE PROCEDURE BBBB(PO_RESULT OUT SYS_REFCURSOR) IS
    BEGIN
      execute immediate 'CREATE GLOBAL TEMPORARY TABLE AAA (NUM VARCHAR2(10),QTY INTEGER) ON  COMMIT  DELETE ROWS ';  execute immediate 'insert into AAA SELECT * FROM sss';  OPEN PO_RESULT FOR 'select * from AAA';
    END BBBB;
    以BlueskyWide 提供的过程为例,具体如下:
    假设我的sss表有时间字段TM,那么我需要插入AAA表时需要时间范围,即语句'insert into AAA SELECT * FROM sss where TM>=t1 and TM<=t2';
    这里t1,t2 是在程序运行时才输入的,我用Delphi+ORACLE,  这时如何修改过程及调用,哪个请教以下   ------------>此题再加50分,解决了马上结贴
      

  12.   

    关键是你要临时表用来干啥呢?  oracle里面可不是很建议用临时表的select * 
    into #b 
    from a 
    where nm='obj' 如果你要对临时表处理,oracle用with
    with x as (
      select * from a where nm='obj'
    )
    select *
      from b, x /* x 就相当于临时表了*/
    ....
      

  13.   

    create table b as select * from a
    这样就行呀,为什么非用临时表呢?
      

  14.   

    稍改一下:你说的这种情形可能要用到包及包体。
    SQL> select * from sss;VALUE1             ID
    ---------- ----------
    1                   1
    2                   2
    3                   3SQL> 
    SQL>   CREATE OR REPLACE package pkg_test is
      2    --定义ref   cursor类型
      3    type myrctype is ref cursor;
      4  
      5    --函数申明
      6    function get(t1 number,t2 number) return myrctype;
      7    end pkg_test;
      8  /Package createdSQL> 
    SQL>   CREATE OR REPLACE package body pkg_test as
      2    --函数体
      3    function get(t1 number,t2 number) return myrctype is
      4    rc myrctype;   --定义ref   cursor变量
      5    sqlstr varchar2(500);
      6    begin
      7    sqlstr :='select * from  sss where id>=:t1 and id<=:t2';
      8    open rc for sqlstr using t1,t2;
      9    return rc;
     10    end get;
     11  
     12    end pkg_test;
     13  /Package body createdSQL> --asp程序中使用:cm1.CommandText = "{call  pkg_test.get(?)}"来调用,因本人对delphi不太熟悉,你可以搜一下或去delphi版问一下。