上面的打字错了,应是:
create or replace procedure xxxx
AS 
    nSQL NUMBER;
  begin
    nSQL := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE( nSQL, 'create table aa as select * FROM bb',
      Sys.DBMS_SQL.v7 ) ;
    DBMS_SQL.CLOSE_CURSOR( nSQL);
  end YG_DFInitProc;但这样在pl/sql developer中可以执行!!
  declare
    nsql NUMBER;
  begin
    nSQL := DBMS_SQL.OPEN_CURSOR;
    DBMS_SQL.PARSE( nSQL, 'create table aa as select * FROM bb',
      Sys.DBMS_SQL.v7 ) ;
    DBMS_SQL.CLOSE_CURSOR( nSQL);
  end YG_DFInitProc;

解决方案 »

  1.   

    也可以写成这样呀
    create or replace procedure xxxx
    AS 
        begin
        
        execute immediate 'create table aa as select * FROM bb';
       
      end YG_DFInitProc;
      

  2.   

    to : welyngj(不做老实人)老大啊:俺的版本是8.05,不能用execute immediate
      

  3.   

    create or replace function test return varchar2 as
        v_cursor number;
        v_string varchar2(200);
        v_row number;
    begin
        v_cursor:=dbms_sql.open_cursor;
        v_string:='create table testdb (text varchar2(200))';
        dbms_sql.parse(v_cursor,v_string,dbms_sql.native);
        v_row:=dbms_sql.execute(v_cursor);
        dbms_sql.close_cursor(v_cursor);
        return ('成功执行'||v_row||'行!');
        exception
            when others then
                dbms_sql.close_cursor(v_cursor);
                return ('执行失败!'||sqlcode||sqlerrm);
                raise;
    end;oracle 8.1.7测试通过.
      

  4.   

    存储过程里面,用户要明确指定可以建立表的权限:即使有DBA的权限也不行:
    把建立表的权限赋予用户GRANT  CREATE TABLE TO USER_NAME;
      

  5.   

    在执行动态SQL时,此用户一定要有此权限比如你的情况,就要对此用户授此权限。
    GRANT  CREATE TABLE TO USER_NAME;