create trigger a_tri
before insert on a
declare
str varchar2(500;
begin
str:='create table b (bb varchar2(10))';
execute immediate str;  --grant create any table to user;
end;
/

解决方案 »

  1.   

    楼上的,不行的这样,会报ora-4092,不能在触发器中commit
      

  2.   

    但是可以用str:='create table b (bb varchar2(10))';
    execute immediate str;  --grant create any table to user;
    建立表的。
      

  3.   

    在早期的PL/SQL中使用了前联编技术,所有的对象都是以编译后的格式存储,这样可以让程序的执行速度尽可能快一些,缺点就是在PL/SQL块中不能直接使用DDL语句(因为DDL要在运行时修改数据库对象,从而导致访问权限动态验证和标识符重绑定,而在前联编中这些都在编译时期就完成了)。不过现在可以通过动态SQL来解决这个问题了。从PL/SQL2.1开始可以使用DBMS_SQL包来实现动态SQL,个人认为这个方式太麻烦。
    从Oracle8i开始可以使用本地动态SQL,这个就方便多了。
      

  4.   

    不太明白呀,能不能说的明白一点呀,具体怎么实现呢?
    我这个用户已经有create any table的权限了,依然ora-4092
      

  5.   

    给你个简单的例子吧,先构造一个字符串,其中包含要执行的SQL语句,然后
    EXECUTE IMMEDIATE SQL命令字符串。DECLARE
    stmt VARCHAR2(2000);
    BEGIN
    -- construct the sql statement
    stmt := ’Create Table ’ || ia.INDEXSCHEMA || ’.’ || ia.INDEXNAME ||  
    ’_STORAGE_TAB’ || ’(col_val, base_rowid, constraint pk PRIMARY KEY ’ ||
    ’(col_val, base_rowid)) ORGANIZATION INDEX AS SELECT ’ ||
    ia.INDEXCOLS(1).COLNAME || ’, ROWID FROM ’ ||
    ia.INDEXCOLS(1).TABLESCHEMA || ’.’ || ia.INDEXCOLS(1).TABLENAME;
    EXECUTE IMMEDIATE stmt;
      

  6.   

    触发器中不能用ddl语句
    除非自己控制事务
    在你的过程中要加一条语句就行了:)