重写发下,刚才可能没描述清楚。另外这次在触发器中加入了自治事务声明,但是还是报错,实在找不到原因,希望大神帮忙
首先贴出触发器代码;
create or replace trigger GET_ORD_ID --触发器,插入数据时候生产订单号,订单号由系统时间+自动增长列组成
  before  insert on POINFO
  declare
  PRAGMA AUTONOMOUS_TRANSACTION;--声明触发器为自治事务
  for each row
  begin
  UserSUPP_ORDID();--调用存储过程
  :new.order_id:=to_char(sysdate,'yyyymmdd')||'&'||SUPP_ORDID.nextval;--给ord_id赋值
  commit;--提交事务
end;
下面是存储过程的代码create or replace procedure UserSUPP_ORDID--根据日期来决定是否更新自动增长序列,假如日期更新,重写建立自动增长列
Authid Current_User--授予权限,不加这句会提示权限不足
is
num number;
begin 
  select count(*) into num FROM poinfo where to_char(sysdate,'yyyymmdd')=to_char(order_date,'yyyymmdd');--查询系统中是否有这个日期
  if(num=0) then--假如没有这个日期
  EXECUTE IMMEDIATE 'drop sequence SUPP_ORDID' ;--删除原有自动增长列,--创建新自动增长列
  EXECUTE IMMEDIATE  'create  sequence SUPP_ORDID  
  start with 1
  increment by 1
  maxvalue 100000
  nocycle
  nocache';
  end if;
end;测试语句
insert into poinfo (SUP_COMID,ORDER_DATE,LINKNAME,TEL) values(1,sysdate,'小二','13512345689');大家也可以看图;

解决方案 »

  1.   

    触发器中,不能使用 DDL 语句;你换一种思路吧,比如,在你插入这条记录前,手工调用一下这个 存储过程 ;
      

  2.   

    在触发器中可以执行ddl语句的。创建序列完全可以。把你的下列代码:
    EXECUTE IMMEDIATE 'drop sequence SUPP_ORDID' ;--删除原有自动增长列,--创建新自动增长列
      EXECUTE IMMEDIATE  'create  sequence SUPP_ORDID  
      start with 1
      increment by 1
      maxvalue 100000
      nocycle
      nocache';修改为:
    DBMS_UTILITY.EXEC_DDL_STATEMENT('drop  sequence SUPP_ORDID ');
    DBMS_UTILITY.EXEC_DDL_STATEMENT('create  sequence SUPP_ORDID  
      start with 1
      increment by 1
      maxvalue 100000
      nocycle
      nocache');查看一下用户有没有只用DBMS_UTILITY包的权限 和创建队列的权限。
      

  3.   

    还有最后一个截图的错误,把for each row 位置放到declare 上面试试
      

  4.   


    按照你说的我改了存储过程,另外在触发器里面把 for each row放到了declare上面,但是编译器还是报错