||' INSERT INTO t_ywlc_zt value
*
value好像是多出来的?
*
value好像是多出来的?
解决方案 »
- Oracle 透明网关访问informix报错????????
- 触发器没有执行
- ORACLE FOR AIX 安装问题,急!
- 跪求:如何不安装10g客户端,用IE访问FTP上的oracle10g数据库?
- 非unicode怎么转换成unicode
- Oracle connect string problem
- 关于 APPEND 什么时候用
- 高分提问:怎么做一个简易的Oracle客户端???
- grant connect,resource to user 究竟包括那些权限,谢谢!20分
- 启动xp系统,安装Oracle 9i Personl,系统没反应,为何?
- oracle中怎样直接调用c程序,请给一个例子?
- HELP:为何我在vc++ 6下用ado连oracle时不能添加新纪录?
跟那个无关,那样也可以编译
你最好加一句
DBMS_OUTPUT.PUT_LINE(createsql);
把拼好的SQL打印出来瞧瞧,就容易发现错误了。
那个语法也没错,我把创建trigger的语句拷到SQL*plus执行也没问题,可能我没说清楚,在工具sqlnav3.exe上打开刚通过过程动态创建的trigger ,这时的trigger是invalid,随便按下空格再编译也没问题
证明语法是没错的,问题是我动态创建的trigger怎么会是invalid.这样讲清楚吗,如果不清楚,
给我邮件:[email protected]
我已经问了好多高手了,他们说可能不能这样创建,说执行的是语句块,而不是一条单一sql语句,象动态创建表就是一条单一的sql语句,就可以通过这种方式创建.而trigger 是语句块,应该要加'/'但是加了也不行.
也没用,都试过了
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';
从来没见过这样动态sql
我是参照以下代码:
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;