原帖地址:http://topic.csdn.net/u/20090228/20/343699d3-89b8-476b-b529-317aa08df053.html?seed=416749060我在存储过程里面写 create table t1;怎么在plsql命令行里面执行通不过呢?
这是什么原理啊?希望管理板块的高淫指点迷津啊!
还有在plsql命令行里面如何执行存储过程呢?

解决方案 »

  1.   

    plsql里面执行存储过程如下:exec pc(pm1,pm2,...);
      

  2.   

    存储过程里面不能直接使用DDL语句。可用动态SQL的语法,即在sql前面加上execute immediate
      

  3.   

    你那样做的用意是什么呀?非要那样才能解决问题吗?
    我看你那样的用意就象要用临时表,如果要用临时表,用下面语句:
    create glogal temporary table 表名
    as 
    select * from tb where ....
    on commit delete rows
    或者
    create glogal temporary table 表名
    as 
    select * from tb where ....
    on commit preserve rows
      

  4.   

    create or replace procedure demo as 
    begin
      execute immediate 'create table test (id int )';
    exception 
      when others then 
        dbms_output.put_line('error:' || sqlerrm);
    end demo;
      

  5.   

    CREATE OR REPLACE PROCEDURE Test1 IS   
          v_Sqlb VARCHAR2(200);     
          Cursor_create VARCHAR2(100);   
          Result NUMBER;   
      BEGIN               
                  v_Sql   :=   '   
                              CREATE   TABLE   T1   
                              (   
                                A   VARCHAR2(200)   
                              )   
                              ';   
                    
                  cursor_create   :=   dbms_sql.open_cursor;   
                  DBMS_SQL.PARSE(cursor_create,   v_SQL,dbms_sql.native);   
                  Result   :=   dbms_sql.EXECUTE(cursor_create);   
                  DBMS_SQL.close_cursor(cursor_create);   
    END Test1;可以参考下,需要用动态游标来创建的。
      

  6.   

    呵呵,楼主就是为了好玩.
    这个应该是编译器本身就不允许你这么做,在动态SQL里面创建的表,其实刚开始编译器并不知道有这个表的,只有执行以后才会有这个表的,所以编译器在编译的时候检查insert into t1 values(3);这句会认为这个表是不存在的,所以报错.
    其实已经有人给出解法了,把所有的语句都放在动态SQL里面就不会有问题.
    个人理解,如有误请多包涵.
      

  7.   


    嗯,用动态SQL来做的吧!应该可以搞定,不过有点消耗资源啊!