||' INSERT INTO t_ywlc_zt value
                           *
value好像是多出来的?

解决方案 »

  1.   

    to Lastdrop(空杯)
    跟那个无关,那样也可以编译
      

  2.   

    过程是没问题是在执行过程创建trigger时出错,但是把创建trigger的语句拷到SQL*plus执行也没问题,好累啊,已经调了好久了.高手帮忙,非常急!!!!!!!!!
      

  3.   

    编译当然没有问题了,因为编译时,Oracle是不会检查你的动态SQL语法的,只有当执行时才会检查,所以应该是编译成功,而执行失败。
    你最好加一句
    DBMS_OUTPUT.PUT_LINE(createsql);
    把拼好的SQL打印出来瞧瞧,就容易发现错误了。
      

  4.   

    to Lastdrop(空杯)
    那个语法也没错,我把创建trigger的语句拷到SQL*plus执行也没问题,可能我没说清楚,在工具sqlnav3.exe上打开刚通过过程动态创建的trigger ,这时的trigger是invalid,随便按下空格再编译也没问题
    证明语法是没错的,问题是我动态创建的trigger怎么会是invalid.这样讲清楚吗,如果不清楚,
    给我邮件:[email protected]
    我已经问了好多高手了,他们说可能不能这样创建,说执行的是语句块,而不是一条单一sql语句,象动态创建表就是一条单一的sql语句,就可以通过这种方式创建.而trigger 是语句块,应该要加'/'但是加了也不行.
      

  5.   

    去掉CHR(13)|| CHR(10)之类的,这些在动态SQL中没有用,语法也通不过。
      

  6.   

    to  Lastdrop(空杯)
    也没用,都试过了
      

  7.   

    给你一个参考例子:
    SQL> create procedure name_pro(p_table in varchar2)
      2  as
      3  str varchar2(100);
      4  v_name varchar2(10);
      5  begin
      6  v_name:='name';
      7  str:='create trigger '||v_name||'_tri
      8        before insert or delete on '||p_table||
      9        'for each row
     10        begin
     11        insert into aa values(:new.id,:new.fid);
     12        end';
     13  execute immediate str;
     14  end;
     15  /Procedure created错误在于此句:
    END;';     --把引号内的分号去掉
    改为:
    END';
      

  8.   

    去掉CHR(13)|| CHR(10)
    从来没见过这样动态sql
      

  9.   

    to  beckhambobo(beckham) 
    我是参照以下代码:
    PROCEDURE CREATE_AUDIT_TRIGGER
     (p_table_name IN VARCHAR2)
    AS
     CURSOR c1 IS SELECT * FROM audit_info WHERE table_name = UPPER (p_table_name);
     v_sql            VARCHAR2 (4000) := NULL;
     v_table_name     VARCHAR2 (30)   := NULL;
     cid2             INTEGER;
     result_set       INTEGER;
     column_fix      VARCHAR2(200);
     value_fix      VARCHAR2(200);
     column_list      VARCHAR2(200);
     value_list      VARCHAR2(200);
    BEGIN
     v_table_name := RTRIM(LTRIM(SUBSTR(RPAD(p_table_name, 30),1,21)));
     cid2 := DBMS_SQL.OPEN_CURSOR;  
     v_sql := 
         'CREATE OR REPLACE TRIGGER ' || v_table_name || '_audit_trig' || CHR(13)|| CHR(10)
     ||  ' AFTER INSERT OR DELETE OR UPDATE ON ' || v_table_name || CHR(13)|| CHR(10)
     ||  ' FOR EACH ROW' || CHR(13)|| CHR(10)
     ||  ' DECLARE' || CHR(13)|| CHR(10)
     ||  ' s_id VARCHAR2(10);' || CHR(13)|| CHR(10)
     ||  ' usr VARCHAR2(20);' || CHR(13)|| CHR(10)
     ||  ' BEGIN ' || CHR(13)|| CHR(10)
     ||  ' s_id:=AUDIT_PKG.GET_SESSION_ID;' || CHR(13)|| CHR(10)
     ||  ' usr:=AUDIT_PKG.GET_USER_NAME;' || CHR(13)|| CHR(10);
     column_fix:='INSERT INTO audit_log(rec_id,table_name,session_id,user_name,action_date,action';
     for rec in c1 loop
     column_list:='';
     value_list:='';
     if rec.key_column_1 is not null then
       column_list:=column_list || ',key_column_1'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.key_column_1 ;
     end if;
     if rec.key_column_2 is not null then
       column_list:=column_list || ',key_column_2'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.key_column_2;
     end if;
     if rec.key_column_3 is not null then
       column_list:=column_list || ',key_column_3'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.key_column_3;
     end if;
     if rec.c_column_1 is not null then
       column_list:=column_list || ',c_column_1'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.c_column_1;
     end if;
     if rec.c_column_2 is not null then
       column_list:=column_list || ',c_column_2'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.c_column_2;
     end if;
       if rec.c_column_3 is not null then
       column_list:=column_list || ',c_column_3'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.c_column_3;
     end if;
       if rec.c_column_4 is not null then
       column_list:=column_list || ',c_column_4'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.c_column_4;
     end if;
    if rec.c_column_5 is not null then
       column_list:=column_list || ',c_column_5'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.c_column_5;
     end if;
     if rec.n_column_1 is not null then
       column_list:=column_list || ',n_column_1'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.n_column_1;
     end if;
     if rec.n_column_2 is not null then
       column_list:=column_list || ',n_column_2'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.n_column_2;
     end if;
       if rec.n_column_3 is not null then
       column_list:=column_list || ',n_column_3'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.n_column_3;
     end if;
       if rec.n_column_4 is not null then
       column_list:=column_list || ',n_column_4'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.n_column_4;
     end if;
       if rec.d_column_1 is not null then
       column_list:=column_list || ',d_column_1'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.d_column_1;
     end if;
     if rec.d_column_2 is not null then
       column_list:=column_list || ',d_column_2'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.d_column_2;
     end if;
     if rec.d_column_3 is not null then
       column_list:=column_list || ',d_column_3'; 
       value_list:=value_list || ',' || ' :NEW.' || rec.d_column_3;
     end if;
     exit;
     end loop;
     
     for rec in c1 loop
         if rec.audit_insert is not null then
             value_fix:='VALUES(audit_seq.nextval,'''|| v_table_name ||''',s_id,usr,SYSDATE,''I''';
             v_sql:=v_sql || 'IF INSERTING THEN '|| CHR(13)|| CHR(10);
             v_sql:=v_sql || column_fix || column_list || ') ';
             v_sql:=v_sql || value_fix || value_list || '); ' || CHR(13)|| CHR(10);
             v_sql:=v_sql || 'END IF;' || CHR(13)|| CHR(10);
         end if;
         if rec.audit_delete is not null then
             value_fix:='VALUES(audit_seq.nextval,'''|| v_table_name ||''',s_id,usr,SYSDATE,''D''';
             v_sql:=v_sql || 'IF DELETING THEN '|| CHR(13)|| CHR(10);
             v_sql:=v_sql || column_fix || column_list || ') ';
             v_sql:=v_sql || REPLACE(value_fix || value_list || '); ',':NEW.',':OLD.') || CHR(13)|| CHR(10);
             v_sql:=v_sql || 'END IF;'|| CHR(13)|| CHR(10);
         end if;
         if rec.audit_update is not null then
             value_fix:='VALUES(audit_seq.nextval,'''|| v_table_name ||''',s_id,usr,SYSDATE,''O''';
             v_sql:=v_sql || 'IF UPDATING THEN '|| CHR(13)|| CHR(10);
             v_sql:=v_sql || column_fix || column_list || ') ';
             v_sql:=v_sql || value_fix || value_list || '); '|| CHR(13)|| CHR(10);
             value_fix:='VALUES(audit_seq.currval,'''|| v_table_name ||''',s_id,usr,SYSDATE,''N''';
             v_sql:=v_sql || column_fix || column_list || ') ';
             v_sql:=v_sql || REPLACE(value_fix || value_list || '); ',':NEW.',':OLD.')|| CHR(13)|| CHR(10);
             v_sql:=v_sql || 'END IF;'|| CHR(13)|| CHR(10);
         end if;
         exit;
     end loop;
     v_sql := v_sql  ||  'END;';
     DBMS_SQL.PARSE(cid2,v_sql,DBMS_SQL.NATIVE);
     result_set := DBMS_SQL.EXECUTE (cid2);
     DBMS_SQL.CLOSE_CURSOR (cid2);
    END;
      

  10.   

    我测试过了,如果不去掉所有的chr(10)和chr(13),就会报" ORA-24344: 成功,但出现编译错误",去掉所有的chr(10)和chr(13)后,就执行成功,同时TRIGGER的status是Enabled!