ITPub博客

首页 > 应用开发 > IT综合 > $$自动创建触发器$$

$$自动创建触发器$$

原创 IT综合 作者:imlihj2007 时间:2008-03-06 16:30:51 0 删除 编辑
1,这个存储过程可以创建特定的instead of 触发器
2,用于特定的视图,他必须包含所有的表列(这个并不影响使用)
create or replace procedure Sp_create_tr(view_names varchar2 ,list_tabs varchar2) is
/*
使用与比较规则的视图!!!!!!
动态创建触发器:目的,方便在视图层进行数据库的操作
传入的表名称必须是字母来表示!!!!!!!!!
从插入开始练习!!!
输入的表名称必须是这样的格式! tabe3name*table*tabel
---LIHJ
*/
LS_create_sql varchar2(5000);
ln_triggs_nos number:=0;
ls_trigger_name varchar2(50):='TR';
ls_triggs_nos varchar2(50);--tr_tab1_tab2_0001 生成的触发器17位
--定义表的名称列表
type
ty_table_name is table of user_tables.table_name%type
index by binary_integer;
ty_tables ty_table_name;
type
ty_tab_pri_info is table of varchar2(1000)
index by binary_integer;
ty_tab_pri ty_tab_pri_info; ----保存对应的主键与列名的信息!
begin
dbms_output.enable(2000000);
dbms_output.put_line('---------create the trigger for view!');
---生成触发的名称
-----------------------------------------------------------------
-------------------------触发器的数量!!
select count(*) into ln_triggs_nos from user_triggers;
ls_triggs_nos:=lpad(ln_triggs_nos,4,'0');
-------------------------获取表的名称列表
declare
ln_list_tabs number:=0;
ln_fuhao number:=1;
ln_ns number:=1;
ls_tabname varchar2(50);
begin
ln_list_tabs:=length(list_tabs);
for i in 1..ln_list_tabs loop
if substrb(list_tabs,i,1)='*' then
begin
ty_tables(ln_ns):=substrb(upper(list_tabs),ln_fuhao,i-ln_fuhao);
ln_ns:=ln_ns+1;
ln_fuhao:=i+1;
end;
end if;
end loop;
ty_tables(ln_ns):=substrb(upper(list_tabs),ln_fuhao);
---------------------验证表的名称是否正确
for i in 1..ty_tables.count loop
declare
ln_counts number:=0;
begin
select count(*) into ln_counts from user_tables where table_name=ty_tables(i);
if ln_counts=0 then
dbms_output.put_line('alert : ◎');
dbms_output.put_line('table :'||ty_tables(i)||' not found!!');
--停止执行程序!返回应用!!!检查问题所在!!
return;
end if;
end;
--dbms_output.put_line('nasme:'||ty_tables(i));
end loop;
--------------------生成触发器名称
for i in 1..ty_tables.count loop
ls_trigger_name:=ls_trigger_name||'_'||substrb(ty_tables(i),1,3);
end loop;
ls_trigger_name:=ls_trigger_name||'_'||ls_triggs_nos;
dbms_output.put_line(ls_trigger_name);
---------------------判断视图是否存在!并找出关键的连接字段
declare
ln_v_nos number:=0;
ls_v_sqls varchar2(1000);
ls_v_sql long;
ln_where number:=0;
ln_orderb number:=0;
begin
select count(*) into ln_v_nos from user_views where view_name=upper(view_names);
if ln_v_nos=0 then
dbms_output.put_line(' the name of the view is wrong!');
return;
end if;
--个等号表示一个字段,一个字段表示要对两个表进行插入判断·!!!
/*
1, 绝对不可以用等号来判断的
2,保证主键可以插近
3,需要对主键或者是唯一件进行判断旧可以拉!
*/
end;

end;
------------------------------------------------------------
------------------------------------------------------------
--生成标头信息!!!!!
dbms_output.put_line(' '||' CREATE OR REPLACE TRIGGER '||ls_trigger_name);
LS_create_sql:='CREATE OR REPLACE TRIGGER '||ls_trigger_name;
dbms_output.put_line(' '||' INSTEAD OF INSERT ON '||view_names);
LS_create_sql:=LS_create_sql||' INSTEAD OF INSERT ON '||view_names;
dbms_output.put_line(' '||' FOR EACH ROW ');
LS_create_sql:=LS_create_sql||' FOR EACH ROW ';
dbms_output.put_line(' '||' declare ');
LS_create_sql:=LS_create_sql||' declare ';
dbms_output.put_line(' '||' V_TEMP NUMBER; ');
LS_create_sql:=LS_create_sql||' V_TEMP NUMBER; ';
dbms_output.put_line(' '||' BEGIN ');
LS_create_sql:=LS_create_sql||' BEGIN ';
--具体列信息的郑和
----------------------------直接获得必要的语句信息!!
for i in 1..ty_tables.count loop
--利用游标获取必要的信息
declare
ls_tab_tr varchar2(2):='★';
ls_tab_cols varchar2(500);
ls_tab_cols_new varchar2(600);
ls_inset_sql varchar2(1000);
begin
for cour_cols in (select column_name from user_tab_columns where table_name= ty_tables(i))loop
ls_tab_cols:=ls_tab_cols||','||cour_cols.column_name;
ls_tab_cols_new:=ls_tab_cols_new||',:new.'||cour_cols.column_name;
--dbms_output.put_line(cour_cols.column_name);
end loop;
--dbms_output.put_line(ltrim(ls_tab_cols,','));
--dbms_output.put_line(ltrim(ls_tab_cols_new,','));
ls_inset_sql:='insert into '||ty_tables(i)||'('||ltrim(ls_tab_cols,',')||') values ('||ltrim(ls_tab_cols_new,',')||');';
--dbms_output.put_line(ls_inset_sql);
ty_tab_pri(i):=ls_inset_sql;
end;
--dbms_output.put_line(substrb(ty_tables(i),1,3));
end loop;
----------------------------验证生成的SQL 语句并进一不生成必要的语句
--dbms_output.put_line(ty_tab_pri.count||' @@');
for i in 1..ty_tab_pri.count loop
--dbms_output.put_line('tets '||i);
LS_create_sql:=LS_create_sql||' '||ty_tab_pri(i);
dbms_output.put_line(' '||ty_tab_pri(i));
end loop;
--dbms_output.put_line('^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^');
----------------------------处理结尾的信息!
dbms_output.put_line(' '||'exception');
LS_create_sql:=LS_create_sql||' '||' exception';
dbms_output.put_line(' '||' when others then ');
LS_create_sql:=LS_create_sql||' when others then ';
dbms_output.put_line(' '||' dbms_output.put_line(substrb(sqlerrm,1,200));');
LS_create_sql:=LS_create_sql||' dbms_output.put_line(substrb(sqlerrm,1,200));';
dbms_output.put_line(' '||'end;');
LS_create_sql:=LS_create_sql||' end;';

--dbms_output.put_line(LS_create_sql);
---------执行必要的动态语句!!!
execute immediate LS_create_sql;
exception
when others then
dbms_output.put_line(substrb(sqlerrm,1,200));

end Sp_create_tr;[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9879835/viewspace-1000495/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: ±±oracle trigger±±
请登录后发表评论 登录
全部评论

注册时间:2011-05-25

  • 博文量
    109
  • 访问量
    1577026