本帖最后由 solovesnow 于 2011-07-06 17:38:17 编辑

解决方案 »

  1.   

    SQL> CREATE GLOBAL TEMPORARY TABLE T_TEMP (
      2  COL1 VARCHAR2(10),
      3  COL2 VARCHAR2(10)
      4  ) ON COMMIT delete ROWS
      5  /Table createdSQL> 
    没有报错,你自己操作问题吧
      

  2.   

    SQL> insert into t_temp values('aaa','bbb');1 row insertedSQL> select count(*) from t_temp;  COUNT(*)
    ----------
             1SQL> delete from t_temp;1 row deletedSQL> drop table t_temp;Table droppedSQL> 
      

  3.   

    把这一大段一起放到sql developer里执行,会报错
      

  4.   

    原因很简单declare v_num varchar2(20);
    begin
    execute immediate '
    CREATE GLOBAL TEMPORARY TABLE T_TEMP (
    COL1 VARCHAR2(10),
    COL2 VARCHAR2(10)
    ) ON COMMIT delete ROWS';
    /*为什么上面创建表时,如果不用execute immediate,直接执行create语句会报错*/--因为plsql程序里面不能发出ddl语句,想发出ddl语句必须采用动态sql,这是规则,没什么可解释的execute immediate 'insert into t_temp values(''aaa'',''bbb'')';
    /*为什么这里不用execute immediate查询,直接insert,会提示表不存在*/--因为你执行plsql程序的时候,oracle会先检查你的语法逻辑,如果你写成
    --insert into t_temp values('aaa','bbb'); 在执行的时候oracle在语法检查后,会检查表存不存在
    --显然这个答案是否定的,执行的时候 t_temp表并不存在,因此检查失败报错
    --但是你使用动态sql写法,oracle就会不检查上面的内容了,因此过了。execute immediate 'select count(*) from t_temp' into v_num;--这里是一样的dbms_output.put_line(v_num);
    execute immediate 'delete from t_temp';
    commit;
    execute immediate 'drop table t_temp'; 
    end;