-- Create table
create global temporary table T_SOLVENCY
(
  L_BH                  NUMBER,
  VC_BH                 VARCHAR2(20),
  VC_NAME               VARCHAR2(200),
  VC_PUBLISH_ORGAN      VARCHAR2(200)
)
on commit preserve rows;如上,我创建了一个临时表,但是我在存储过程里对这张表写入数据后,过程执行完后,查了一下该临时表,始终为空?注,存储过程百分之一千没有问题.
不知怎么回事? on commit preserve rows;这句话应该就是说明该表的数据是在同一个会话中有效的,为什么在存储过程里执行插不进去??

解决方案 »

  1.   

    on commit preserve rows; 
    是会话级别的
      

  2.   

    还是要查查你的百分之一千的过程,insert是否成功了,是否commit了,SQL> 
    SQL> create global temporary table T
      2  (
      3    A VARCHAR2(255)
      4  )
      5  on commit preserve rows;Table createdSQL> insert into t values('a');1 row insertedSQL> commit;Commit completeSQL> select * from t;A
    --------------------------------------------------------------------------------
    a
      

  3.   

    insert成功的,绝对commit过, 我把临时表改成实体表就可以正常插入的.如果把单条语句拿出来执行也是可以正常插入的,但是就是在过程里不行.
      

  4.   

    在存储过程中插入临时表后,就查询临时表的记录数,看看是否插入成功,然后在commit和存储过程结束处再分别查临时表记录数。
      

  5.   

    在存储过程中插入临时表后,就查询临时表的记录数,看看是否插入成功,然后在commit和存储过程结束处再分别查临时表记录数。
    ------------------------回楼上兄弟, 在commit前,我输出到一个实体临时表里,实体表是有数据的.
      

  6.   

    create global temporary table T
      (
       A VARCHAR2(255)
     )
     on commit preserve rows;CREATE OR REPLACE procedure ll00003
    is
    begin
    insert into  t values('a');   
    end;
    /
    ------------
    test1
    begin
    ll00003;
    end;
    select * from t; 
    ---a
    test2
    begin
    ll00003;
    end;
    commit;
    ---
      a
      a
    select * from t; 
      

  7.   

    在存储过程commit之前执行是可以查到临时表里的数据的.貌似这个临时表只是事务级别的.
      

  8.   

    大伙都说了这么多了.就是session(回话)级别.简单的来说,在当前连接没有中断的情况下,插入的数据始终是可见的.如果你中断了一个回话,那么下级再查询那么就没有了.
    commit或者不commit都是一样可见的.
      

  9.   

    在存储过程commit之前执行是可以查到临时表里的数据的.貌似这个临时表只是事务级别的.--建议lz重新创建一下临时表
      

  10.   

    一个会话的生命周期有多长?一个存储过程执行开始时会创建一个session?执行完毕session就结束吗?
      

  11.   

    看不出有什么错误,建议用以下代码测试一下sqlplus myconnection-- execute procedure
    my_procedure;select * from T_SOLVENCY;
      

  12.   

    仔细查查存储过程吧,看看在存储过程中对这个表insert后是否又做了其他动作。
      

  13.   

    insert 后只有  commit
      

  14.   

    commit后存储过程就结束了吗?
      

  15.   

    临时表是transaction结束后会自动清空的,执行一个procedure结束后也会自动结束transaction (相当于一个DDL过程或者DML的commit/rollback),所以procedure结束后procedure里面的对临时表的插入也会清空,不管你commit与否.
      

  16.   

    建议你还是写个测试的存储过程,看看也出现你讲的那样数据在存储过程执行完后就没了。
    例如
    create or replace procedure p_test
    as
    begin
      delete T_SOLVENCY;
      insert into T_SOLVENCY values(1,to_char(sysdate,'hh24:mi:ss'),null,null);
      commit;
    end;
    /select * from T_SOLVENCY;
    exec p_test
    select * from T_SOLVENCY;
      

  17.   

    临时表在存储过程中不能用commit,一旦commit临时表就会被清空,只要不执行commit就可以了。
      

  18.   

    不好意思,楼主说的是会话级的,我说的是事物级的。要么你试试使用事物级的,并且不使用commit。
      

  19.   

    回:   bobfang(匆匆过客) ( ) 信誉:120 
    我用你的代码测试了一下,确实还是问题照旧, 存储过程执行完后临时表里还是没有记录.
      

  20.   

    你确信临时表是on commit preserve rows?我的测试如下
    连接到:
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - ProductionSQL> create global temporary table T_SOLVENCY
      2  (
      3    L_BH                  NUMBER,
      4    VC_BH                 VARCHAR2(20),
      5    VC_NAME               VARCHAR2(200),
      6    VC_PUBLISH_ORGAN      VARCHAR2(200)
      7  )
      8  on commit preserve rows;表已创建。SQL> create or replace procedure p_test
      2  as
      3  begin
      4    delete T_SOLVENCY;
      5    insert into T_SOLVENCY values(1,to_char(sysdate,'hh24:mi:ss'),null,null);
      6    commit;
      7  end;
      8  /过程已创建。SQL>
    SQL> select * from T_SOLVENCY;未选定行SQL> exec p_testPL/SQL 过程已成功完成。SQL> select * from T_SOLVENCY;      L_BH VC_BH
    ---------- --------------------
    VC_NAME
    --------------------------------------------------------------------------------
    VC_PUBLISH_ORGAN
    --------------------------------------------------------------------------------
             1 15:52:50
    SQL>
      

  21.   

    lz最好不要用自己的临时表存储过程测试使用bobfang(匆匆过客)或者我的代码,测试一下是否正确