3,491
社区成员
发帖
与我相关
我的任务
分享
create or replace procedure proc(tabname in varchar2,
col1 in varchar2,
col2 in varchar2,
col3 in varchar2,
viewname in varchar2 default 'v_tmp')
as
sqlstr varchar2(2000):='create or replace view '||viewname||' as select '||col1||' ';
c1 sys_refcursor;
v1 varchar2(100);
begin
open c1 for 'select distinct to_char('||col2||') from '||tabname;
loop
fetch c1 into v1;
exit when c1%notfound;
sqlstr:=sqlstr||'
,max(decode('||col2||','''||v1||''','||col3||'))"'||v1||'"';
end loop;
close c1;
sqlstr:=sqlstr||' from '||tabname||' group by '||col1;
execute immediate sqlstr;
end proc;
--测试表
create table tab as select 36 counter,'英语' subject,'一班' class from dual
union all select 44,'英语','二班' from dual
union all select 44,'数学','二班' from dual
union all select 33,'语文','一班' from dual
union all select 39,'语文','三班' from dual;
select * from tab;
--触发器
create or replace trigger tg_tab
after insert or delete or update on tab
declare
PRAGMA AUTONOMOUS_TRANSACTION;
begin
proc('tab','subject','class','counter');
commit;
end;
--测试
delete from tab where counter=44;
select * from v_tmp;
SUBJECT 一班 三班 二班
英语 36
语文 33 39
rollback;
select * from v_tmp;
SUBJECT 一班 三班 二班
数学 44
英语 36 44
语文 33 39