Oracle views, custom functions, stored procedures, triggers

View is a virtual table, a map of the actual table, a package aimed at a number of complex queries, the actual table data changes, the data view automatically changes

CREATE OR REPLACE VIEW V_TONY
AS
SELECT A.EMPNO AS EMPNO,A.EMPNO AS EMPNO1,A.ENAME AS ENAME,A.JOB AS JOB,B.DNAME AS DNAME,B.LOC AS LOC
FROM SCOTT.EMP A,SCOTT.DEPT B
WHERE A.DEPTNO=B.DEPTNO AND A.DEPTNO=10


SELECT * FROM V_TONY;

Function and only has to return a stored procedure no return value, if necessary returning multiple values or no return value, stored procedure
function is mainly used to calculate, for a specific return data, the storage process is mainly perform a series of operations

--创建函数,获取员工薪水
CREATE OR REPLACE FUNCTION FUN_GETSAL(ENO NUMBER) RETURN NUMBER 
AS
RES_SAL NUMBER;
BEGIN
  SELECT SAL INTO RES_SAL FROM EMP WHERE EMPNO = ENO;
  RETURN RES_SAL;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20012, '不存在的员工编号');
END;

SELECT FUN_GETSAL(7499) FROM DUAL; --可以调用函数,但不可调用存储过程

--调用上面的FUN_GETSAL函数
DECLARE
  RES_SAL NUMBER;
  EX EXCEPTION;
  PRAGMA EXCEPTION_INIT(EX, -20012);
BEGIN
  RES_SAL := FUN_GETSAL(7499);
  DBMS_OUTPUT.PUT_LINE('薪水:' || RES_SAL);
EXCEPTION
  WHEN EX THEN
    DBMS_OUTPUT.PUT_LINE('不存在此员工');
END;

Stored procedure returns if the user exists, IN input, the output OUT

CREATE OR REPLACE PROCEDURE PROC_ISEXIST(PID IN EMP.EMPNO%TYPE,RET OUT NUMBER) 
AS
FLAG NUMBER;
BEGIN
  SELECT COUNT(1) INTO FLAG FROM EMP WHERE EMPNO = PID;
  IF FLAG = 1 THEN
    DBMS_OUTPUT.PUT_LINE(PID || '用户存在');
    RET := 1;
  ELSE
    DBMS_OUTPUT.PUT_LINE(PID || '用户不存在');
    RET := 0;
  END IF;
END;

DECLARE
  NUM VARCHAR(50) := ('&输入编号');
  RET   NUMBER;
BEGIN
  PROC_ISEXIST(NUM, RET);
  DBMS_OUTPUT.PUT_LINE(RET);
END;

Triggers mandatory data consistency, enable complex business logic

--禁止星期日的时候,对表进行写操作
CREATE TABLE A(ID NUMBER,NAME VARCHAR(10));
INSERT INTO A VALUES(1,'Tony');
INSERT INTO A VALUES(2,'Tony2');
INSERT INTO A VALUES(3,'Tony3');
SELECT * FROM A;
--创建触发器
CREATE OR REPLACE TRIGGER TRI_NOTWRITE
  BEFORE INSERT OR UPDATE OR DELETE ON A
BEGIN
  IF (TO_CHAR(SYSDATE, 'DY') = '星期日') THEN
    RAISE_APPLICATION_ERROR(-20600, '星期日禁止对A表进行写操作');
  END IF;
END;

--触发器实现序号自增
CREATE TABLE B(ID NUMBER(10) PRIMARY KEY,UNAME VARCHAR(10));
--定义序列(2019001,2019002,2019003,...)
CREATE SEQUENCE MYSEQ INCREMENT BY 1 START WITH 2019001 NOMAXVALUE NOCYCLE CACHE 20;
--创建触发器
CREATE OR REPLACE TRIGGER TRI_INC
  BEFORE INSERT ON B
  FOR EACH ROW --语句级触发,每一行触发一次
DECLARE
  NEXTID NUMBER;
BEGIN
  SELECT MYSEQ.NEXTVAL INTO NEXTID FROM DUAL; --返回上述定义好的序列号
  :NEW.ID := NEXTID; --:NEW表示新插入的记录
END;
--测试数据
INSERT INTO B(UNAME) VALUES('TONY1');
INSERT INTO B(UNAME) VALUES('TONY2');
INSERT INTO B(UNAME) VALUES('TONY3');
COMMIT;

--触发器记录对表写操作的一些日志
--创建对B表操作的B_LOG日志表
CREATE TABLE B_LOG(LUSER VARCHAR2(10),LTYPE VARCHAR2(20),LDATE DATE);
--创建触发器
CREATE OR REPLACE TRIGGER B_TRIGGER
  AFTER INSERT OR DELETE OR UPDATE ON B
DECLARE
  V_TYPE B_LOG.LTYPE%TYPE;
BEGIN
  IF INSERTING THEN
    V_TYPE := 'INSERT';
    DBMS_OUTPUT.PUT_LINE('记录成功插入!');
  ELSIF DELETING THEN
    V_TYPE := 'DELETE';
    DBMS_OUTPUT.PUT_LINE('记录成功删除!');
  ELSIF UPDATING THEN
    V_TYPE := 'UPDATE';
    DBMS_OUTPUT.PUT_LINE('记录成功更新!');
  END IF;
  INSERT INTO B_LOG VALUES (USER, V_TYPE, SYSDATE);
END;

--测试数据
INSERT INTO B(UNAME) VALUES('LESLIE');
UPDATE B SET UNAME='LESLIE1' WHERE ID=2019001;
DELETE FROM B WHERE ID=2019002;
COMMIT;

 You can use triggers to implement some statistical data tables are automatically updated

--触发器来统计各个部门的人数和薪水
--创建EMP的统计映射表:EMP_TOTAL
CREATE TABLE EMP_TOTAL AS
SELECT DEPTNO, COUNT(EMPNO) AS TOTAL_NUMS, SUM(SAL) AS TOTAL_SAL FROM EMP GROUP BY DEPTNO;

--创建触发器
CREATE OR REPLACE TRIGGER EMP_TRIGGER
  AFTER INSERT OR DELETE OR UPDATE ON EMP
DECLARE
  CURSOR CUR_EMP IS
    SELECT DEPTNO, COUNT(EMPNO) AS TOTAL_NUMS, SUM(SAL) AS TOTAL_SAL
      FROM EMP
     GROUP BY DEPTNO;
BEGIN
  DELETE EMP_TOTAL; --插入统计数据之前先清空原来数据
  FOR V_EMP IN CUR_EMP LOOP
    DBMS_OUTPUT.PUT_LINE(V_EMP.DEPTNO || V_EMP.TOTAL_NUMS ||V_EMP.TOTAL_SAL);
    INSERT INTO EMP_TOTAL
    VALUES
      (V_EMP.DEPTNO, V_EMP.TOTAL_NUMS, V_EMP.TOTAL_SAL);
  END LOOP;
END;

--测试数据
DELETE FROM EMP WHERE EMPNO=8888;
INSERT INTO EMP (EMPNO, DEPTNO, SAL) VALUES (8888, 10, 1000);
INSERT INTO EMP (EMPNO, DEPTNO, SAL) VALUES (9999, 10, 1000);
SELECT * FROM EMP;
SELECT * FROM EMP_TOTAL;

--触发器启用与禁用
ALTER TRIGGER trigger_name DISABLE;
ALTER TRIGGER trigger_name ENABLE;

To automatically record data was deleted by the trigger

CREATE TABLE PEOPLE(ID VARCHAR2(10),UNAME VARCHAR2(10),AGE NUMBER);
INSERT INTO PEOPLE VALUES(100,'TONY',30);
INSERT INTO PEOPLE VALUES(101,'LESLIE',20);
INSERT INTO PEOPLE VALUES(102,'CHYICHIN',50);

--创建一张保存被删除的数据的表
CREATE TABLE PEOPLE_DELDATA AS SELECT * FROM PEOPLE WHERE 1=2;
--创建触发器
CREATE OR REPLACE TRIGGER PEOPLE_TRIGGER
  AFTER DELETE ON PEOPLE
  FOR EACH ROW --语句级触发,每行都触发一次
BEGIN
  INSERT INTO PEOPLE_DELDATA VALUES (:OLD.ID, :OLD.UNAME, :OLD.AGE); --:OLD表示删除的值
END;

SELECT * FROM PEOPLE;
DELETE FROM PEOPLE WHERE ID=100;
SELECT * FROM PEOPLE_DELDATA;--这张表将会通过触发器自动保存删除过的数据

 

Published 46 original articles · won praise 9 · views 3660

Guess you like

Origin blog.csdn.net/weixin_41896770/article/details/100848324