设为首页 收藏本站
查看: 581|回复: 0

[经验分享] Oracle过程,函数,包和触发器

[复制链接]

尚未签到

发表于 2016-8-8 07:42:15 | 显示全部楼层 |阅读模式
第十章 过程,函数,包和触发器

认识存储过程和函数
CREATE OR REPLACE PROCEDURE TEST
  (EMP_NO EMP.EMPNO%TYPE,
   SALARY EMP.SAL%TYPE)
IS(/AS)
  EMP_NAME EMP.ENAME%TYPE;
BEGIN
  UPDATE EMP SET SAL = SALARY WHERE EMPNO = EMP_NO;
  COMMIT;
  SELECT ENAME INT EMP_NAME FROM EMP WHERE EMPNO = EMP_NO;
  DBMS_OUTPUT.PUT_LINE(EMP_NAME);
END TEST;

查看过程:
DESC USER_OBJECTS;
SELECT * FROM USER_OBJECTS WHERE OBJECT_NAME='TEST';
SELECT TEXT FROM USER_SOURCE WHERE NAME='TEST' ORDER BY LINE;
SPOOL C:/TEST.SQL;
SPOOL OFF;

执行方法:
1, EXECUTE TEST(7788,3300);
2,
BEGIN
  TEST(7788, 3500);
END;

查看错误:
SELECT * FROM USER_ERRORS;

删除过程:
DROP PROCEDURE XXX

修改过程,重新编译:
ALTER PROCEDURE XX COMPILE;

形式参数三种模式:IN,OUT,IN OUT.
OUT只可能出现在赋值语句的左边.
也可出现在INTO后.还可输出.

当有OUT参数时的调用方式(只能通过块来调用):
DECLARE
EN EMP.ENAME%TYPE;
BEGIN
EN := 'SCOTT';
TEST1(7788,3500, EN);
DBMS_OUTPUT.PUT_LINE(EN);
END;
-----------------------------
函数:
CREATE OR REPLACE FUNCTION FIND_NUM
  RETURN NUBMER
IS
  NUM NUMBER(5);
BEGIN
  SELECT COUNT(*) INTO NUM FROM EMP;
  RETURN NUM;
END FIND_NUM;

函数可以赋给一个变量,也可直接输出.

DESC XX;
可以直接查看过程与函数的参数列表.

过程与函数异常处理与Java类似.

过程与函数的安全性:
可以对权限进行灵活控制.
GRANT EXECUTE ON XXX TO SCOTT;

SELECT * FROM USER_DEPENDENCES;

===============================
包(PACKAGE)
包说明是操作接口.
CREATE OR REPLACE PACKAGE P1
AS
PROCUDEURE UPDATE_EMP(
EMP_NO EMP.EMPNO%TYPE,);
FUNCTION ....
TYPE CUR IS REF CURSOR;
PROCEDURE FIND_ALL(EMPLIST OUT CUR);
END P1;

使用系统包来操纵文件:
GRANT CREATE ANY DIRECTORY TO SCOTT;
CREATE DIRECTORY ABC AS 'C:/TMPFILE';
DESC DBA_DIRECTORIES;
SELECT * FROM DBA_DIRECTORIES;

CREATE OR REPLACE PROCEDURE GENERATE
  (
  DIRNAME VARCHAR2,
  FILENAME VARCHAR2,
  OBJECTNAME VARCHAR2
  )
AS
  CURSOR FILECURSOR IS SELECT TEXT FROM USER_SOURCE WHERE NAME=OBJECTNAME ORDER BY LINE;
  FILEID UTL_FILE.FILE_TYPE;
BEGIN
  FILEID = UTL_FILE.FOPEN(DIRNAME, FILENAME,'W');
  FOR LINES IN FILECURSOR LOOP
    UTL_FILE.PUT(FILEID,LINES.TEXT);
  END LOOP;
  UTL_FILE.FCLOSE(FILEID);
END;

=================================
触发器
语句级触发器
CREATE OR REPLACE TRIGGER TR1
  BEFORE INSERT OR UPDATE ON EMP
  FOR EACH ROW
DECLARE
  EMPNAME EMP.ENAME%TYPE;
BEGIN
  IF INSERTING THEN
    DBMS_OUTPUT.PUT_LINE(:NEW.ENAME);
    INSERT INTO EMP_LOG VALUES(:NEW.EMPNO,'INSERT'SYSDATE);
  ELSIF UPDATING THEN
    INSERT INTO EMP_LOG VALUES(:OLD.EMPNO,'UPDATE'SYSDATE);
    DBMS_OUTPUT.PUT_LINE(:NEW.ENAME);
  END IF;
END;

限制一周内插入数据的时间
CREATE OR REPLACE TRIGGER SECURE_EMP
BEFORE INSERT ON EMP
DECLARE
  V_DUMMY VARCHAR2(1);
BEGIN
  IF(TO_CHAR(SYSDATE,'DY')
......

行级触发器
CREATE OR REPLACE TRIGGER TR3
  BEFORE INSERT ON EMP
  FOR EACH ROW
DECLARE
  EX EXCEPTION;
BEGIN
  IF :NEW.SAL > 10000 THEN
    RAISE EX;
  END IF;
  EXCEPTION
    WHEN EX THEN
      DBMS_OUTPUT.PUT_LINE('TOO MUCH MONEY');
END;

触发器的触是按照创建的先后顺序触发的.
在数据上的操作,遇到系统异常会全部回滚.

INSTEAD OF触发器
用于操作视图的插入,修改,删除
create or replace trigger xxx
instead of insert on employee_names
begin
....
end;

触发器的管理
alter trigger ..
alter trigger ..
enable,disable

* 触发器每一次触发时都会重新编译.

user_triggers 数据字典查看系统有哪些触发器.

在触发器中进行的数据操作:
1,修改没有关联的表的数据.
2,修改被触发表的不同列数.
3,禁止修改表中主键值.
7,不允许从一个变化的表中读取数据.

触发器常见应用:
安全性
审计

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254710-1-1.html 上篇帖子: Oracle函数续与连接查询 下篇帖子: Oracle 数据库更换表空间
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表