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;--这张表将会通过触发器自动保存删除过的数据