關於oracle的函數,存儲過程,觸發器,序列,視圖,左右連接一些的應用 帶案例

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;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章