2. 课程地位 .Net & C# SQL Server XML SPM ASP.NET & WebService Oracle UML SPR: Computer Base HTML&JavaScript SQL Server Base OOP&Java Base C STB JSP /Servlet EJB&WebService WinForms Struts&JSF Testing&SQA Linux
111. 同义词 3-2 CREATE SYNONYM emp FOR SCOTT.emp; SCOTT.emp 的别名 模式名 表名 私有同义词 公有同义词 CREATE PUBLIC SYNONYM emp_syn FOR SCOTT.emp; 同义词名称
112. 同义词 3-3 创建或替换现有的同义词 CREATE OR REPLACE SYNONYM emp_syn FOR SCOTT.emp; 替换现有的同义词 SQL> DROP SYNONYM emp; SQL> DROP PUBLIC SYNONYM emp_syn; 删除同义词
113.
114.
115. 更改和删除序列 SQL> ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE; 使用 ALTER SEQUENCE 语句修改序列, 不能更改序列的 START WITH 参数 使用 DROP SEQUENCE 语句删除序列 SQL> DROP SEQUENCE toys_seq;
116.
117. 创建视图 3-1 Stud_details Stud_view 创建视图 CREATE VIEW stud_view AS SELECT studno, studname, subno FROM Stud_details; Open 5 40 Jesica 3 SC 4 33 James 2 Open 2 45 Rob 1 studcaste subno studmarks studname studno 5 Jesica 3 4 James 2 2 Rob 1 subno studname studno
118.
119.
120. 联接视图 2-1 Stud_details Sub_details CREATE VIEW Stud_sub_view AS SELECT Studno, Studname, Submrks, Subname FROM Stud_details, Sub_Details WHERE Stud_details.Subno=Sub_details.Subno; Stud_sub_view 联接视图 4 33 James 2 4 40 Jesica 3 2 45 Rob 1 Subno Submrks Studname Studno Science 5 Maths 4 English 2 Subname Subno English 45 Rob 1 Maths 40 Jesica 3 Maths 33 James 2 Subname Submrks Studname Studno
121. 联接视图 2-2 创建外联接视图 CREATE VIEW ven_ord_outj_view AS SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm, order_master om WHERE vm.vencode = om.vencode(+); SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm LEFT OUTER JOIN order_master om ON vm.vencode = om.vencode;
122.
123. 键保留表 Stud_details Sub_details 键保留表 因为 Studno 既是 Stud_details 中的主键, 也是联接结果中的主键 Stud_details 为什么 是键保留表? 联接视图 4 33 James 2 4 40 Jesica 3 2 45 Rob 1 Subno Submrks Studname Studno Science 5 Maths 4 English 2 Subname Subno Maths 4 40 Jesica 3 Maths 4 33 James 2 English 2 45 Rob 1 Subname Subno Submarks Studname Studno
124.
125.
126.
127. 索引 3-3 SQL> CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs; 创建标准索引 重建索引 SQL> ALTER INDEX item_index REBUILD; 删除索引 SQL> DROP INDEX item_index;
172. 隐式游标 4-2 SQL> SET SERVEROUTPUT ON SQL> BEGIN UPDATE toys SET toyprice=270 WHERE toyid= 'P005'; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE(‘ 表已更新 '); END IF; END; / 只有在 DML 语句影响一行 或多行时,才返回 True
173. 隐式游标 4-3 SQL> SET SERVEROUTPUT ON SQL> DECLARE v_TOYID TOYS.ID%type := '&TOYID'; v_TOYNAME TOYS.NAME%Type := '&TOYNAME'; BEGIN UPDATE TOYS SET NAME = v_TOYNAME WHERE toyid=v_TOYID; IF SQL%NOTFOUND THEN DBMS_OUTPUT.PUT_LINE(' 编号未找到。 '); ELSE DBMS_OUTPUT.PUT_LINE(‘ 表已更新 '); END IF; END; / 如果 DML 语句不影响任何行,则返回 True
174. 隐式游标 4-4 SQL> SET SERVEROUTPUT ON SQL> BEGIN UPDATE vendor_master SET venname= 'Rob Mathew' WHERE vencode='V004'; DBMS_OUTPUT.PUT_LINE (SQL%ROWCOUNT); END; / 返回 DML 语句影响的行数
175. SELECT INTO 语句 2-1 SQL> SET SERVEROUTPUT ON SQL> DECLARE empid VARCHAR2(10); desig VARCHAR2(10); BEGIN empid:= '&Employeeid'; SELECT designation INTO desig FROM employee WHERE empno=empid; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(' 职员未找到 '); END; / 如果没有与 SELECT INTO 语句中的条件匹配的行,将引发 NO_DATA_FOUND 异常
176. SELECT INTO 语句 2-2 SQL> SET SERVEROUTPUT ON SQL> DECLARE empid VARCHAR2(10); BEGIN SELECT empno INTO empid FROM employee; EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(' 该查询提取多行 '); END; / 如果 SELECT INTO 语句返回多个值, 将引发 TOO_MANY_ROWS 异常
177.
178. 显式游标 2-2 SQL>SET SERVER OUTPUT ON SQL>DECLARE my_toy_price toys.toyprice%TYPE; CURSOR toy_cur IS SELECT toyprice FROM toys WHERE toyprice<250; BEGIN OPEN toy_cur; LOOP FETCH toy_cur INTO my_toy_price; EXIT WHEN toy_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE ('TOYPRICE=: 玩具单价 = : '||my_toy_price); END LOOP; CLOSE toy_cur; END; 声明游标 打开游标 提取行 关闭游标
179.
180.
181. 使用显式游标更新行 2-2 SQL> SET SERVEROUTPUT ON SQL> DECLARE new_price NUMBER; CURSOR cur_toy IS SELECT toyprice FROM toys WHERE toyprice<100 FOR UPDATE OF toyprice; BEGIN OPEN cur_toy; LOOP FETCH cur_toy INTO new_price; EXIT WHEN cur_toy%NOTFOUND; UPDATE toys SET toyprice = 1.1*new_price WHERE CURRENT OF cur_toy; END LOOP; CLOSE cur_toy; COMMIT; END;
182.
183. 循环游标 2-2 SQL> SET SERVER OUTPUT ON SQL> DECLARE CURSOR mytoy_cur IS SELECT toyid, toyname, toyprice FROM toys; BEGIN FOR toy_rec IN mytoy_cur LOOP DBMS_OUTPUT.PUT_LINE( ‘ 玩具编号: '||' ' ||toy_rec.toyid||' ' ||‘ 玩具名称: '||' '||toy_rec.toyname||' ' ||‘ 玩具单价: '||' '||toy_rec.toyprice); END LOOP; END;
184.
185.
186. REF 游标和游标变量 3-3 SQL> DECLARE TYPE toys_curtype IS REF CURSOR RETURN toys%ROWTYPE; toys_curvar toys_curtype; toys_rec toys%ROWTYPE; BEGIN OPEN toys_curvar FOR SELECT * FROM toys; FETCH toys_curvar INTO toys_rec; ... CLOSE toys_curvar; END; 声明 REF 游标类型 声明游标变量
197. 过程 8-3 CREATE OR REPLACE PROCEDURE find_emp(emp_no NUMBER) AS empname VARCHAR2(20); BEGIN SELECT ename INTO empname FROM EMP WHERE empno = emp_no; DBMS_OUTPUT.PUT_LINE(' 雇员姓名是 '|| empname); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (' 雇员编号未找到 '); END find_emp; /
198.
199.
200. 过程 8-6 SQL> CREATE OR REPLACE PROCEDURE test( value1 IN VARCHAR2, value2 OUT NUMBER ) IS identity NUMBER; BEGIN SELECT ITEMRATE INTO identity FROM itemFile WHERE itemcode = value1; IF identity < 200 THEN value2:=100; END IF; END; DECLARE value1 VARCHAR2(5) := 'i202'; value2 NUMBER; BEGIN test (value1, value2); DBMS_OUTPUT.PUT_LINE('value2 的值为 ' || TO_CHAR(value2)); END; /
201. 过程 8-7 CREATE OR REPLACE PROCEDURE swap(p1 IN OUT NUMBER, p2 IN OUT NUMBER) IS v_temp NUMBER; BEGIN v_temp := p1; p1 := p2; p2 := v_temp; END; / SQL> SET SERVEROUT ON SQL> DECLARE num1 NUMBER := 100; num2 NUMBER := 200; BEGIN swap(num1, num2); DBMS_OUTPUT.PUT_LINE('num1 = ' || num1); DBMS_OUTPUT.PUT_LINE('num2 = ' || num2); END; /
202.
203.
204.
205.
206. 函数 4-4 CREATE OR REPLACE FUNCTION item_price_range (price NUMBER) RETURN VARCHAR2 AS min_price NUMBER; max_price NUMBER; BEGIN SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price FROM itemfile; IF price >= min_price AND price <= max_price THEN RETURN ' 输入的单价介于最低价与最高价之间 '; ELSE RETURN ' 超出范围 '; END IF; END; / DECLARE P NUMBER := 300; MSG VARCHAR2(200); BEGIN MSG := item_price_range(300); DBMS_OUTPUT.PUT_LINE(MSG); END; /
212. 创建程序包 2-2 CREATE OR REPLACE PACKAGE pack_me IS PROCEDURE order_proc (orno VARCHAR2); FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2; END pack_me; / CREATE OR REPLACE PACKAGE BODY pack_me AS PROCEDURE order_proc (orno VARCHAR2) IS stat CHAR(1); BEGIN SELECT ostatus INTO stat FROM order_master WHERE orderno = orno; …… END order_proc; FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2 IS icode VARCHAR2(5); ocode VARCHAR2(5); BEGIN …… END order_fun; END pack_me; /
213.
214.
215. 程序包中的游标 2-2 SQL> CREATE OR REPLACE PACKAGE cur_pack IS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE; PROCEDURE ord_pro(vcode VARCHAR2); END cur_pack; / SQL> CREATE OR REPLACE PACKAGE BODY cur_pack AS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS SELECT * FROM order_master WHERE VENCODE=vcode; PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE; BEGIN OPEN ord_cur(vcode); LOOP FETCH ord_cur INTO or_rec; EXIT WHEN ord_cur%NOTFOUND; DBMS_OUTPUT.PUT_LIne(’ 返回的值为 ' || or_rec.orderno); END LOOP; END ord_pro; END cur_pack; /
226. 创建触发器 CREATE OR REPLACE TRIGGER aiu_itemfile AFTER INSERT ON itemfile FOR EACH ROW BEGIN IF (:NEW.qty_hand = 0) THEN DBMS_OUTPUT.PUT_LINE(' 警告:已插入记录,但数量为零 '); ELSE DBMS_OUTPUT.PUT_LINE(‘ 已插入记录 '); END IF; END; /