--创建触发器(行级触发器) create or replace trigger tri_update_emp_bak after update on emp_bak for each row --每更新一行 就触发一次 begin --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据 dbms_output.put_line('更新后' || :NEW.sal); dbms_output.put_line('更新前' || :OLD.sal); if updating then end if; if inserting end; --创建触发器(行级触发器)(前置) create or replace trigger tri3_update_emp_bak before update on emp_bak for each row --每更新一行 就触发一次 begin --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据 dbms_output.put_line('更新后' || :NEW.sal); dbms_output.put_line('更新前' || :OLD.sal); end; select * from emp_bak update emp_bak set sal = 1000 where empno in (7788) --创建触发器(表级触发器) --//表级别触发器里面 不允许使用 :NEW :OLD 变量 create or replace trigger tri2_update_emp_bak after update on emp_bak begin -- dbms_output.put_line('更新后' || :NEW.sal); --dbms_output.put_line('更新前' || :OLD.sal); end; --创建触发器(行级触发器) create or replace trigger tri4_update_emp_bak after update of sal on emp_bak for each row --每更新一行 就触发一次 begin --oracle 里面 对触发器 也提供了特殊的对象 :NEW :OLD 来访问 更新前后的数据 dbms_output.put_line('更新后' || :NEW.sal); dbms_output.put_line('更新前' || :OLD.sal); end; create table userinfo ( userid number(4) primary key, username varchar2(20) ) create table addrinfo ( addrid number(4) primary key, addname varchar2(20), userid number(4) references userinfo(userid) ) insert into userinfo values (1,'李四') insert into addrinfo values (1,'湖北武汉',1) select * from addrinfo delete from userinfo where userid =1 --级联删除 create or replace trigger tri_userinfo_delete before delete on userinfo for each row begin delete from addrinfo where userid = :OLD.userid; -- insert into end; create table dept_bak as select * from dept create or replace view myview as select a.empno,a.ename,a.sal,b.dname from emp a inner join dept b on a.deptno = b.deptno select * from myview update myview set sal = 1000,dname='aaaaa' where empno = 7499 --替代触发器 用在视图上面 只能是行级的 --替代触发器 特点是 真正的操作已经 变成了一个动作而已 功能由触发器来完成 create or replace trigger tri_myview instead of update on myview begin dbms_output.put_line('删除操作执行了。。。'); update emp set sal = :NEW.sal where empno = :OLD.empno; update dept set dname = :NEW.dname where dname = :OLD.dname; --delete from emp where empno = :OLD.empno; end; select * from emp; select * from dept; update emp_bak set ename ='aaaa',sal = 10000 where empno in (7788) --系统包 -- 产生随机数 **** **** **** **** --dbms_random.value 0-1 之间的随机小数 --dbms_random.random 随机整数 select dbms_random.value from dual; create or replace procedure proc_cardno(mycardno out varchar2) as tempcard varchar2(50); cardno varchar2(19); begin tempcard:= dbms_random.value; cardno:=substr(tempcard,2,4)||' '||substr(tempcard,6,4)||' '||substr(tempcard,10,4)||' '||substr(tempcard,14,4); mycardno:=cardno; -- dbms_output.put_line(tempcard); -- dbms_output.put_line(cardno); end; --使用UTL_FILE包读写文件 create directory MY_DIR as 'd:/temp'; create directory MY_DIR2 as 'd:/temp2'; declare --定义文件对象 myfile utl_file.file_type; --定义变量 用来存储每读出一行的数据 linestr varchar2(200); begin --打开文件 myfile:= utl_file.fopen('MY_DIR','oracle.log','r'); --进行读取(循环) loop utl_file.get_line(myfile,linestr); dbms_output.put_line(linestr); end loop; exception when others then utl_file.fclose(myfile); dbms_output.put_line('读取完毕!'); end; declare --定义文件对象 myfile utl_file.file_type; --定义变量 用来存储每读出一行的数据 linestr varchar2(200); begin --打开文件 myfile:= utl_file.fopen('MY_DIR','oracle.log','a'); --追加数据 --utl_file.get_line(myfile,linestr); utl_file.put_line(myfile,'你好,这是新的数据',true); utl_file.fclose(myfile); exception when others then utl_file.fclose(myfile); dbms_output.put_line('读取完毕!'); end; --拷贝 declare --定义文件对象 sourcefile utl_file.file_type; targetfile utl_file.file_type; --定义变量 用来存储每读出一行的数据 linestr varchar2(200); begin --打开文件 sourcefile:= utl_file.fopen('MY_DIR','oracle.log','r'); targetfile:= utl_file.fopen('MY_DIR2','copy.txt','a'); --进行读取(循环) 并且写入到新的文件里面 loop utl_file.get_line(sourcefile,linestr); utl_file.put_line(targetfile,linestr,true); -- dbms_output.put_line(linestr); end loop; exception when others then utl_file.fclose(sourcefile); utl_file.fclose(targetfile); dbms_output.put_line('拷贝完毕!'); end;