CREATE TABLE STUDENT( --創建學生表
ID NUMBER(10) PRIMARY KEY, --主鍵ID
NAME VARCHAR2(20),
CLASSNAME VARCHAR2(20) --班級ID
);
CREATE SYNONYM STU FOR STUDENT; --給學生表STUDENT創建別名(同義詞)
INSERT INTO STUDENT VALUES(1,'Tom',1);
INSERT INTO STUDENT VALUES(2,'Jack',1);
INSERT INTO STUDENT VALUES(3,'Bay',2);
INSERT INTO STUDENT VALUES(4,'John',3);
INSERT INTO STUDENT VALUES(5,'Dld',2);
INSERT INTO STUDENT VALUES(6,'Fmhn',4);
INSERT INTO STUDENT VALUES(7,'Ecls',3);
INSERT INTO STUDENT VALUES(9,'Wsms',3);
INSERT INTO STUDENT VALUES(8,'Qmndk',4);
--以上是添加數據 還沒有常見觸發器和序列的時候 ID不能自動增長 所以要不能寫null 要明確指定---DELETE STUDENT; --刪除學生表的所有數據
ALTER TABLE STUDENT RENAME COLUMN NAME TO SNAME; --把學生表中列名爲‘NAME’的列的名字 改爲‘SNAME’
SELECT * FROM STUDENT; --查詢學生表所以的數據
CREATE TABLE CLASSTAB( --創建班級表
CLASSID NUMBER(2) PRIMARY KEY, --班級ID
CNAME VARCHAR2(20)
);
INSERT INTO CLASSTAB VALUES(1,'3G');
INSERT INTO CLASSTAB VALUES(2,'SVSE');
INSERT INTO CLASSTAB VALUES(3,'GIS');
INSERT INTO CLASSTAB VALUES(4,'EM');
SELECT * FROM CLASSTAB; --查詢班級表的所有數據
--創建視圖
CREATE OR REPLACE VIEW V_SC
AS
SELECT s.SNAME,c.CNAME FROM STUDENT s LEFT JOIN CLASSTAB c ON s.CLASSNAME=c.CLASSID;--左鏈接
--調用視圖
SELECT * FROM V_SC;
--創建函數 返回3G班的總人數
CREATE OR REPLACE FUNCTION FUN_NUM
(IN_CNAME IN CLASSTAB.CNAME%TYPE)
RETURN NUMBER
AS
OUT_NUM NUMBER;
BEGIN
IF IN_CNAME ='3G' THEN
SELECT COUNT(CNAME) INTO OUT_NUM FROM V_SC WHERE CNAME='3G';
ELSIF IN_CNAME='SVSE' THEN
SELECT COUNT(CNAME) INTO OUT_NUM FROM V_SC WHERE CNAME='SVSE';
ELSIF IN_CNAME = 'GIS' THEN
SELECT COUNT(CNAME) INTO OUT_NUM FROM V_SC WHERE CNAME='GIS';
ELSIF IN_CNAME = 'EM' THEN
SELECT COUNT(CNAME) INTO OUT_NUM FROM V_SC WHERE CNAME = 'EM';
END IF;
RETURN OUT_NUM;
END FUN_NUM;
--調用函數
SELECT DISTINCT FUN_NUM('GIS') AS 人數 from V_SC;
--創建存儲過程 給學生表添加一條記錄
CREATE OR REPLACE PROCEDURE PROCEDURE_ADD
(IN_ID IN STUDENT.ID%TYPE,IN_SNAME STUDENT.SNAME%TYPE,IN_CLASSNAME STUDENT.CLASSNAME%TYPE)
AS
BEGIN
INSERT INTO STUDENT VALUES(IN_ID,IN_SNAME,IN_CLASSNAME);
DBMS_OUTPUT.PUT_LINE('數據添加成功!');
END PROCEDURE_ADD;
--調用過程的時候 因爲這是添加數據 所以添加完後 要commit提交 不然顯示不了添加的數據
--在調用之前要SET SERVEROUT ON
EXECUTE PROCEDURE_ADD(NULL,'AA',3);
--創建序列
CREATE SEQUENCE SEQ_STU
INCREMENT BY 1
START WITH 11
MAXVALUE 99999
MINVALUE 1;
--創建觸發器 添加數據的時候id自增
CREATE OR REPLACE TRIGGER TIGGER_STU
BEFORE
INSERT ON STUDENT
FOR EACH ROW
WHEN(NEW.ID IS NULL)
BEGIN
SELECT SEQ_STU.NEXTVAL INTO:NEW.ID FROM DUAL;
END;
INSERT INTO STUDENT VALUES(NULL,'AA',2);
--創建觸發器 刪除班級時 將該班級的所有學生信息也刪除
CREATE OR REPLACE TRIGGER MYTRIGGER
AFTER DELETE
ON CLASSTAB
FOR EACH ROW
BEGIN
DELETE FROM STUDENT WHERE CLASSNAME = :old.CLASSID;
END;
--:old.CLASSID 是觸發器操作的那種表 :old就相當於那張表 本例子中觸發器操作的是CLASSTAB這張表 所以:old相當於CLASSSTAB這張表
DELETE FROM CLASSTAB WHERE CLASSID = 2;
SELECT * FROM STUDENT;
SELECT * FROM CLASSTAB;