📄 createnonmutating.sql
字号:
/* * createNonMutating.sql * Chapter 10, Oracle10g PL/SQL Programming * by Ron Hardman, Michael McLaughlin and Scott Urman * * This script demonstrates user defined package and triggers. */SET ECHO ONCREATE OR REPLACE PACKAGE StudentData AS TYPE t_Majors IS TABLE OF students.major%TYPE INDEX BY BINARY_INTEGER; TYPE t_IDs IS TABLE OF students.ID%TYPE INDEX BY BINARY_INTEGER; v_StudentMajors t_Majors; v_StudentIDs t_IDs; v_NumEntries BINARY_INTEGER := 0;END StudentData;/show errorsCREATE OR REPLACE TRIGGER RLimitMajors BEFORE INSERT OR UPDATE OF major ON students FOR EACH ROWBEGIN /* Record the new data in StudentData. We don't make any changes to students, to avoid the ORA-4091 error. */ StudentData.v_NumEntries := StudentData.v_NumEntries + 1; StudentData.v_StudentMajors(StudentData.v_NumEntries) := :new.major; StudentData.v_StudentIDs(StudentData.v_NumEntries) := :new.id;END RLimitMajors;/CREATE OR REPLACE TRIGGER SLimitMajors AFTER INSERT OR UPDATE OF major ON studentsDECLARE v_MaxStudents CONSTANT NUMBER := 2; v_CurrentStudents NUMBER; v_StudentID students.ID%TYPE; v_Major students.major%TYPE;BEGIN /* Loop through each student inserted or updated, and verify that we are still within the limit. */ FOR v_LoopIndex IN 1..StudentData.v_NumEntries LOOP v_StudentID := StudentData.v_StudentIDs(v_LoopIndex); v_Major := StudentData.v_StudentMajors(v_LoopIndex); -- Determine the current number of students in this major. SELECT COUNT(*) INTO v_CurrentStudents FROM students WHERE major = v_Major; -- If there isn't room, raise an error. IF v_CurrentStudents > v_MaxStudents THEN RAISE_APPLICATION_ERROR(-20000, 'Too many students for major ' || v_Major || ' because of student ' || v_StudentID); END IF; END LOOP; -- Reset the counter so the next execution will use new data. StudentData.v_NumEntries := 0;END SLimitMajors;/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -