版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第7章 過程、函數(shù)和程序包,7.1 7.2 7.3 小結(jié) 上機(jī)實驗七,7.1 子 程 序 以前我們寫的PL/SQL語句程序都是瞬時的,都沒有命名。其缺點是:在每次執(zhí)行的時候都要被編譯,并且不能被存儲在數(shù)據(jù)庫中,其他PL/SQL塊也無法調(diào)用它們?,F(xiàn)在我們把命名的PL/SQL塊叫做子程序,它們存儲在數(shù)據(jù)庫中,可以為它們指定參數(shù),可以在數(shù)據(jù)庫客戶端和應(yīng)用程序中調(diào)用。命名的PL/SQL程序包括存儲過程和函數(shù)。程序包是存儲過程和函數(shù)的集合。子程序結(jié)構(gòu)與PL/SQL匿名塊的相同點在于都由聲明、執(zhí)行、異常三大部分構(gòu)成,不同之處在于,PL/SQL匿名塊的聲明可選,而子程序的聲明則是必需的。,子程序的優(yōu)點如下:
2、(1) 模塊化:通過子程序可以將程序分解為可管理的、明確的邏輯模塊。(2) 可重用性:子程序在創(chuàng)建并執(zhí)行后,就可以在任何應(yīng)用程序中使用。(3) 可維護(hù)性:子程序可以簡化維護(hù)操作。(4) 安全性:用戶可以設(shè)置權(quán)限,保護(hù)子程序中的數(shù)據(jù),只能讓用戶提供的過程和函數(shù)訪問數(shù)據(jù)。這不僅可以讓數(shù)據(jù)更加安全,同時可保證正確性。子程序有兩種類型:過程和函數(shù)。其中,過程用于執(zhí)行某項操作;函數(shù)用于執(zhí)行某項操作并返回值。,7.1.1 過程1過程的創(chuàng)建和執(zhí)行過程可使用create procedure語句創(chuàng)建,語法如下:create or replace procedure . parameter list Is|as
3、local_declarations; Begin executable statementsexception Exception_handlers End procedure_name;,保留字Is前面的過程定義稱為過程頭。過程頭包括過程名和具有數(shù)據(jù)類型的參數(shù)列表。過程體包括聲明部分、執(zhí)行部分和異常處理部分。過程體從保留字Is之后開始。其中,聲明部分和異常處理部分是可選的;執(zhí)行部分至少包含一條語句。這里的Is|as就相當(dāng)于declare聲明部分,除了擁有前面的一個過程聲明語句外,其他和以前的匿名PL/SQL塊一樣。其中,replace表示在創(chuàng)建存儲過程中,如果已經(jīng)存在同名的存儲過程,則重新
4、創(chuàng)建;如果沒有此關(guān)鍵詞,則當(dāng)數(shù)據(jù)庫中有同名的過程時會報錯“ORA-00955號錯誤:名稱已被現(xiàn)有對象占用”。必須將同名的過程刪除后才能創(chuàng)建。,1) 創(chuàng)建不帶參數(shù)的過程。【例7.1】 創(chuàng)建一個過程multiplication,用來實現(xiàn)九九乘法表。SQL create or replace procedure multiplication 2 as 3 i integer; 4 j integer; 5 begin 6 dbms_output.put_line(print multiplication ); 7 for i in 1.9 loop 8 for j in 1.9 loop 9 if
5、i=j then,10 dbms_output.put(to_char(j)|*| 11 to_char(i)|=|to_char(i*j)| ); 12 end if; 13 end loop; 14 dbms_output.put_line(); 15 end loop; 16 end; 17 / 過程已創(chuàng)建。出現(xiàn)編譯錯誤的時候可以用show error或者desc user_errors來調(diào)試。,2) 執(zhí)行過程創(chuàng)建過程的時候并不會執(zhí)行過程,必須在這之后調(diào)用過程來執(zhí)行。執(zhí)行過程的方法有兩種:一種是在SQL提示符下,使用execute語句來執(zhí)行過程;另一種是在匿名塊中調(diào)用。execute執(zhí)行
6、過程的語法如下:execute procedure_name (parameters_list);,【例7.2】 執(zhí)行multiplication過程。SQL set serverout on -將SQL*Plus的輸出打開SQL execute multiplication -執(zhí)行過程multiplication用execute命令。print multiplication1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18
7、4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81PL/SQL 過程已成功完成。,【例7.3】 在匿名塊中調(diào)用過程multiplication。SQL begin 2 multiplication; 3 end; 4 /程序運行結(jié)果同上。,2創(chuàng)建帶參數(shù)的過程調(diào)用程序通過參數(shù)可向被調(diào)用子
8、程序傳遞值。在上述語法parameter list 中,參數(shù)的具體形式如下:參數(shù)1,方式1數(shù)據(jù)類型1,參數(shù)2,方式2數(shù)據(jù)類型2,參數(shù)方式有以下三種:(1) IN表示接受值為默認(rèn)值。(2) OUT表示將值返回給子程序的調(diào)用程序。(3) IN OUT表示接受值并返回已更新的值。,參數(shù)的書寫格式為:(參數(shù)1 IN|OUT|IN OUT參數(shù)類型, 參數(shù)2IN|OUT|IN OUT參數(shù)類型,)。參數(shù)IN模式是默認(rèn)模式。如果未指定參數(shù)的模式,則認(rèn)為該參數(shù)是IN參數(shù)。對于OUT和IN OUT參數(shù),必須明確指定,并且這兩種類型的參數(shù)在返回到調(diào)用環(huán)境之前必須先賦值。IN參數(shù)可以在調(diào)用時賦默認(rèn)值,而OUT參數(shù)和I
9、N OUT參數(shù)不可以。,1) 創(chuàng)建帶IN模式參數(shù)的過程 【例7.4】 創(chuàng)建一個過程,以雇員號為參數(shù)查詢雇員的姓名和職位。SQL create or replace procedure queryEmpName(sFindNo emp.EmpNo%type) 2 as 3 sName emp.ename%type; 4 sJob emp.job%type; 5 begin 6 select ename,job into sName,sJob from emp 7 where empno=sFindNo; 8 dbms_output.put_line(ID is |sFindNo| de zhig
10、ong name is |,9 sName| gongzuo is |sJob); 10 exception 11 when no_data_found then 12 dbms_output.put_line(no data); 13 when too_many_rows then 14 dbms_output.put_line(too many data); 15 when others then 16 dbms_output.put_line(error); 17 end; 18 /過程已創(chuàng)建。,【例7.5】 執(zhí)行queryEmpName過程。SQL exec queryEmpName(
11、7900);ID is 7900 de zhigong name is JAMES gongzuo is CLERK同樣,也可通過匿名塊調(diào)用過程queryEmpName。SQL Begin 2 queryEmpName(7900); 3 end; 4 /,2) 創(chuàng)建帶OUT模式參數(shù)的過程【例7.6】 創(chuàng)建一個過程,以雇員號查詢雇員的薪水。SQL create or replace procedure queryEmpSal(sFindNo emp.EmpNo%type,v_sal out emp.sal%type) 2 as 3 begin 4 select sal into v_sal fr
12、om emp 5 where empno=sFindNo; 6 dbms_output.put_line(The salary of |sFindNo|is : |v_sal);,7 exception 8 when no_data_found then 9 dbms_output.put_line(no data); 10 when too_many_rows then 11 dbms_output.put_line(too many data); 12 when others then 13 dbms_output.put_line(error); 14 end;/過程已創(chuàng)建。此過程帶有一
13、個輸入?yún)?shù)sFindNo和輸出參數(shù)v_sal,程序根據(jù)輸入?yún)?shù)到表中查詢記錄,以返回該員工的薪水值。,【例7.7】 執(zhí)行queryEmpSal過程??梢月暶饕粋€變量,用如下的方式調(diào)用該過程。SQL var salary number;SQL exec queryEmpSal(7900,:salary);The salary of 7900is : 950PL/SQL 過程已成功完成。,另外,也可以從一個匿名的PL/SQL程序中執(zhí)行上述過程,以顯示sal_out變量的輸出結(jié)果。以下代碼可以顯示queryEmpSal過程的返回值。Declare value number;Begin queryEm
14、pSal(7934,value); DBMS_OUTPUT.PUT_LINE(VALUE的值為|to_char(value);End;/,3) 創(chuàng)建帶IN OUT模式參數(shù)的過程【例7.8】 創(chuàng)建兩個數(shù)進(jìn)行交換的過程。SQL create or replace procedure swap(p1 IN OUT number, p2 IN OUT number) 2 as 3 temp number; 4 begin 5 temp:=p1; 6 p1:=p2; 7 p2:=temp; 8 end; 9 /SQL /過程已創(chuàng)建。,【例7.9】 執(zhí)行swap過程。SQL Declare 2 N1 nu
15、mber:=10; 3 N2 number:=20; 4 Begin 5 swap(N1,N2); 6 DBMS_OUTPUT.PUT_LINE(N1的值是|N1); 7 DBMS_OUTPUT.PUT_LINE(N2的值是|N2); 8 End; 9 /N1的值是20N2的值是10PL/SQL 過程已成功完成。,3過程的授權(quán)只有創(chuàng)建過程的用戶和管理員才有使用過程的權(quán)限,如以上示例,創(chuàng)建的過程就像創(chuàng)建的表一樣,屬于當(dāng)前操作的用戶,其他用戶如果要調(diào)用過程,則需要得到該過程的EXECUTE權(quán)限,然后通過點標(biāo)記(dot notation)(即“用戶名.過程名”)來調(diào)用過程(數(shù)據(jù)字典是user_sou
16、rce)。以下演示如何授權(quán):SQLGRANT EXECUTE ON swap TO John;SQLGRANT EXECUTE ON queryEmpName TO PUBLIC;前者將swap過程的執(zhí)行權(quán)限授予John用戶,后者將queryEmpName的執(zhí)行權(quán)限授予所有數(shù)據(jù)庫用戶。,4刪除過程刪除存儲過程的命令的一般格式如下:DROP PROCEDURE .;【例7.10】 刪除過程 multiplication。SQL DROP PROCEDURE multiplication過程已丟棄。,7.1.2 函數(shù)函數(shù)與過程相似,也是數(shù)據(jù)庫中存儲的已命名PL/SQL程序塊。與過程不同的是,函數(shù)除
17、了完成一定的功能外,還必須返回一個值。1創(chuàng)建函數(shù)創(chuàng)建函數(shù)是指通過RETURN子句指定函數(shù)返回值的數(shù)據(jù)類型。在函數(shù)體的任何地方,用戶都可以通過RETURN expression語句從函數(shù)返回。,定義函數(shù)的語法如下:CREATE OR REPLACE FUNCTION . parameters listRETURN IS|ASlocal_declarations;Beginexecutable statementsexception Exception_handlersEnd;其中,F(xiàn)UNCTION 為 PL/SQL函數(shù)的關(guān)鍵字。,【例7.11】 創(chuàng)建一個函數(shù),以雇員號查詢雇員的姓名。SQL cr
18、eate or replace function getName(sno varchar2) 2 return varchar 3 is 4 name varchar(12); 5 begin 6 select ename into name from emp 7 where empno=sno; 8 return name; 9 exception 10 when too_many_rows then 11 dbms_output.put_line(too many data); 12 when others then 13 dbms_output.put_line(error); 14 e
19、nd; 15 /函數(shù)已創(chuàng)建。,2執(zhí)行函數(shù)及授權(quán)1) 在匿名塊中調(diào)用函數(shù)調(diào)用與過程調(diào)用很相似,在匿名過程中通過函數(shù)名(或參數(shù))可以調(diào)用一個函數(shù)。因為過程沒有顯式的RETURN語句,所以過程調(diào)用可以是一條單獨的語句,寫在單獨的行中。而函數(shù)則必須有一個返回值,所以函數(shù)調(diào)用要借助于可執(zhí)行語句來完成,例如賦值語句、選擇語句和輸出語句。下面的例子通過匿名過程調(diào)用getname函數(shù),將雇員號作為參數(shù),此函數(shù)將雇員姓名傳給調(diào)用塊,然后顯示雇員姓名。,【例7.12】 通過匿名過程調(diào)用getname函數(shù)。SQL declare 2 name varchar(12); 3 begin 4 name:=getname
20、(7902); 5 dbms_output.put_line(name); 6 end; 7 /FORDPL/SQL 過程已成功完成。,2) 在SQL語句中調(diào)用除了在匿名塊中調(diào)用外,也可以在SQL語句中調(diào)用函數(shù)?!纠?.13】 在SQL語句中調(diào)用getname,顯示雇員號為“7369”的雇員姓名。SQL select getname (7369) from dual;GETNAME(7369)-SMITH,【例7.14】 從雇員表中查找雇員號為“7369”的雇員信息。SQL Select * from emp where ename=getname(7369);EMPNO ENAME JOB
21、MGR HIREDATE SAL COMM DEPTNO - - - - - - - - 7369 SMITH CLERK 7902 17-12月-80 800 20,3函數(shù)的授權(quán)與過程一樣,只有創(chuàng)建函數(shù)的用戶和管理員才有權(quán)使用函數(shù),其他用戶如果要調(diào)用函數(shù),則需要得到該函數(shù)的EXECUTE權(quán)限?!纠?.15】 將getname函數(shù)的執(zhí)行權(quán)限授予John用戶。SQLGRANT EXECUTE ON getname TO John;,4刪除函數(shù)刪除函數(shù)的命令的一般格式如下:DROP FUNCTION .;【例7.16】 刪除函數(shù) getname。SQL DROP FUNCTION getname;
22、,7.1.3 過程和函數(shù)的比較 表7-1 過程和函數(shù)的比較,7.2 程 序 包7.2.1 程序包概述程序包是數(shù)據(jù)庫中的一個實體,包含一系列公共常量、變量、數(shù)據(jù)類型、游標(biāo)、過程及函數(shù)的定義。使用包更加體現(xiàn)了模塊化編程的優(yōu)點,使得開發(fā)工作能靈活自如地進(jìn)行。程序包包括兩個部分:程序包規(guī)范說明部分和程序包主體部分。,1程序包規(guī)范說明部分該部分相當(dāng)于一個包的頭,類似于接口,可以對包的部件作簡單說明。其中的過程、函數(shù)、變量、常量和游標(biāo)都是公共的,可在應(yīng)用程序中訪問。(1)使用create package進(jìn)行創(chuàng)建。(2)包含公用對象和類型。(3)聲明類型、變量、常量、異常、游標(biāo)和子程序。 (4)可以在沒有程
23、序包主體部分的情況下存在。,2程序包主體部分(1)使用create package body進(jìn)行創(chuàng)建。(2)包含子程序和游標(biāo)的定義。(3)包含私有聲明。(4)不能在沒有程序包規(guī)格說明的情況下存在。,7.2.2 創(chuàng)建程序包程序包包括兩部分:規(guī)范和主體。規(guī)范是程序包的公共接口;主體是規(guī)范的實現(xiàn),以及私有例程、數(shù)據(jù)和變量。1創(chuàng)建程序包規(guī)范CREATE OR REPLACE PACKAGE package_name IS | AS 公用類型或變量常量的聲明; 公用過程或函數(shù)的聲明; END package_name; /,2創(chuàng)建程序包主體CREATE OR REPLACE PACKAGE BODY p
24、ackage_name IS | AS 私有類型或變量常量的聲明; 公用過程或函數(shù)的實現(xiàn); END package_name 規(guī)范是程序包的接口,規(guī)范中定義的所有內(nèi)容都可以由調(diào)用者使用(當(dāng)然需要具有EXECUTE特權(quán)),比如規(guī)范中定義的過程函數(shù)可以被執(zhí)行,類型可以被訪問,變量可以被引用。,【例7.17】 使用兩個過程print_ename()和print_sal(),定義名為employee_pkg的程序包。SQL CREATE OR REPLACE 2 PACKAGE employee_pkg as 3 Procedure print_ename(p_empno number); 4 Pro
25、cedure print_sal(p_empno number); 5 End; 6 /程序包已創(chuàng)建。,此時并沒有為過程提供代碼,只是定義了名稱和參數(shù)。 這個時候如果試圖使用這個包,則會報錯。SQL exec employee_pkg.print_ename(1234); ERROR 位于第 1 行:ORA-04068: 已丟棄程序包的當(dāng)前狀態(tài)ORA-04067: 未執(zhí)行,package body SCOTT.EMPLOYEE_PKG 不存在ORA-06508: PL/SQL: 無法在調(diào)用之前找到程序單元ORA-06512: 在line 1,程序包是過程函數(shù)的具體實現(xiàn)部分,實現(xiàn)規(guī)范中定義的接口
26、。 SQL CREATE OR REPLACE 2 PACKAGE BODY employee_pkg as 3 Procedure print_ename(p_empno number) is 4 L_ename emp.ename%type; 5 Begin 6 Select ename into l_ename from emp where empno=p_empno; 7 Dbms_output.put_line(l_ename);,8 Exception 9 When no_data_found then 10 Dbms_output.put_line(Invalid employe
27、e number); 11 End print_ename; 12 Procedure print_sal(p_empno number) is 13 L_sal emp.sal%type; 14 Begin 15 Select sal into l_sal from emp where empno=p_empno; 16 Dbms_output.put_line(l_sal);,17 Exception 18 When NO_DATA_FOUND then 19 Dbms_output.put_line(Invalid employee number); 20 End print_sal;
28、21 End employee_pkg; 22 / 程序包主體已創(chuàng)建。,7.2.3 執(zhí)行程序包執(zhí)行程序包中的過程可以使用如下語句:EXECUTE 包名.過程名【例7.18】 執(zhí)行employee_pkg包里的print_ename過程。SQLset serveroutput on SQL exec employee_pkg.print_ename(7782);運行結(jié)果如下:CLARKPL/SQL 過程已成功完成。SQLexec employee_pkg.print_sal(7782);運行結(jié)果如下:2450PL/SQL 過程已成功完成。執(zhí)行程序包中的函數(shù)可以通過一段代碼塊來實現(xiàn)。,7.2.4
29、程序包中的游標(biāo)程序包中可以定義和使用游標(biāo)。游標(biāo)的定義分為游標(biāo)規(guī)范和游標(biāo)主體兩部分。在游標(biāo)規(guī)范說明部分必須通過RETURN語句指定游標(biāo)的返回類型。RETURN語句指定游標(biāo)獲取和返回的數(shù)據(jù)元素由select語句確定。select語句只出現(xiàn)在主體定義中,而不出現(xiàn)在規(guī)范說明中。,【例7.19】 下面使用程序包中的游標(biāo)。student_package程序包中包含4個過程和1個函數(shù)。其中,select_student過程中使用了游標(biāo)。詳細(xì)過程如下:(1) 首先創(chuàng)建student表結(jié)構(gòu)。SQLcreate table student (stuid varchar2(4), stuname varchar2(
30、10),se char(1);表已創(chuàng)建。,(2) 定義聲明。SQL create or replace package student_package is 2 type student_cur is ref cursor return student%rowtype; 3 procedure insert_student(stu in student%rowtype); 4 procedure update_student(stu student%rowtype); 5 procedure delete_student(sno student.stuid%type); 6 procedure
31、 select_student(stucur in out student_cur); 7 function getStudentCount return number; 8 end student_package; 9 /程序包已創(chuàng)建。,(3) 定義主體。SQL create or replace package body student_package is 2 procedure insert_student(stu student%rowtype) is 3 icount int; 4 begin 5 select count(*) into icount from student w
32、here stuid=stu.stuid; 6 if icount0 then 7 dbms_output.put_line(insert data is already exsist); 8 else 9 insert into student values(stu.stuid,stu.stuname,stu.se); 10 commit; 11 end if;,12 exception 13 when too_many_rows then 14 dbms_output.put_line(insert data is already exsist); 15 end insert_studen
33、t; 16 procedure update_student(stu student%rowtype) is 17 icount int; 18 begin 19 select count(*) into icount from student where stuid=stu.stuid; 20 if icount0 then 21 update student set stuname=stu.stuname,se=stu.se where stuid=stu.stuid;,22 commit; 23 else 24 dbms_output.put_line(update data not e
34、xist!); 25 end if; 26 end update_student; 27 procedure delete_student(sno student.stuid%type) is 28 icount int; 29 begin 30 if icount0 then 31 delete from student where stuid=sno; 32 commit; 33 else,34 dbms_output.put_line(delete data not exist); 35 end if; 36 end delete_student; 37 procedure select
35、_student(stucur in out student_cur) is 38 begin 39 open stucur for select * from student; 40 end select_student; 41 function getStudentCount return number is 42 icount int; 43 begin 44 select count(*) into icount from student; 45 return icount; 46 end getStudentCount; 47 end student_package; 48 /程序包
36、主體已創(chuàng)建。,(4) 調(diào)用程序包插入一行數(shù)據(jù)。SQL declare 2 stu student%rowtype; 3 begin 4 stu.stuid:=1009; 5 stu.stuname:=tonglei; 6 stu.se:=f; 7 student_package.insert_student(stu); 8 end; 9 /PL/SQL 過程已成功完成。,(5) 調(diào)用程序包中的過程select_student顯示數(shù)據(jù)。SQL var ss refcursor -定義游標(biāo)變量SQL exec student_package.select_student(:ss);PL/SQL 過
37、程已成功完成。顯示游標(biāo)變量內(nèi)容如下:SQL print ssSTUI STUNAME S- - -1009 tonglei f,7.2.5 程序包的優(yōu)點程序包的優(yōu)點如下:(1)模塊化。包可以使邏輯上相關(guān)聯(lián)的類型、項目和子程序等封裝進(jìn)一個命名PL/SQL塊中。每個包劃分功能清晰,包的接口簡單、明了。(2) 可重用性。一旦命名并保存在數(shù)據(jù)庫中,任何應(yīng)用都可以使用。 (3) 簡單的應(yīng)用程序設(shè)計。當(dāng)設(shè)計應(yīng)用程序時,只需知道包的接口部分的信息,可以只創(chuàng)建并編譯包的規(guī)范而不創(chuàng)建包體。同樣可以在程序中引用包,等整個應(yīng)用程序完成后再來定義具體的包體。,(4)抽象和數(shù)據(jù)隱藏。可以指定公有信息和私有信息。只有公有
38、信息才可以被外部應(yīng)用程序訪問。(5)更好的執(zhí)行效能。包里的子程序第一次被調(diào)用時,整個包被調(diào)到內(nèi)存中,以后的調(diào)用就可以直接從內(nèi)存中讀取。這樣可以減少不必要的重新編譯。,7.2.6 有關(guān)子程序和程序包的信息子程序和程序包是數(shù)據(jù)庫中存儲的對象,Oracle會在數(shù)據(jù)字典中存儲所有對象的信息。通過查詢數(shù)據(jù)字典可以獲得它們的信息。通過查詢USER_OBJECTS數(shù)據(jù)字典視圖可以獲取有關(guān)在會話中創(chuàng)建的字程序和程序包的信息。,【例7.20】 獲取程序包中子程序和程序包的信息。SQLCOLUMN OBJECT_NAME FORMAT A18SQL SELECT OBJECT_NAME,OBJECT_TYPE F
39、ROM USER_OBJECTS WHERE OBJECT_TYPE IN(PROCEDURE,FUNCTION,PACKAGE,PACKAGE BODY);OBJECT_NAME OBJECT_TYPE- -EMPLOYEE_PKG PACKAGEEMPLOYEE_PKG PACKAGE BODYQUERYEMPNAME PROCEDUREQUERYEMPSAL PROCEDURESWAP PROCEDURE,【例7.21】 要獲取存儲子程序的文本,可以查詢USER_SOURCE。SQLCOLUMN LINE FORMAT 9999SQLCOLUMN TEXT FOR A50SQLSELEC
40、T LINE,TEXT FROM USER_SOURCE WHERE NAME=SWAP; LINE TEXT - 1 procedure swap(p1 IN OUT number,p2 IN OUT number) 2 as 3 temp number; 4 begin 5 temp:=p1; 6 p1:=p2; 7 p2:=temp; 8 end;,【例7.22】 獲得程序包中子程序規(guī)范employee_pkg信息。SQL DESC employee_pkg;PROCEDURE PRINT_ENAME,7.3 小 結(jié) 過程、函數(shù)和子程序都可以用于執(zhí)行對數(shù)據(jù)庫的操作,可以帶上用戶自定義的參
41、數(shù)。它們封裝了數(shù)據(jù)類型定義、變量說明、游標(biāo)、異常等,方便了用戶管理操縱數(shù)據(jù)庫數(shù)據(jù)。,習(xí)題七一、選擇題1執(zhí)行特定任務(wù)的子程序是( )。A. 函數(shù) B. 過程 C. 程序包 D. 游標(biāo)2子程序的( )模式參數(shù)可以在調(diào)用子程序時指定一個常量。A. IN B. OUT C. IN OUT 3. 如果存儲過程的參數(shù)類型為OUT,那么調(diào)用時傳遞的參數(shù)應(yīng)該為( )。A. 常量B. 表達(dá)式 C. 變量 D. 都可以,4下列有關(guān)存儲過程的特點,說法錯誤的是( )。A. 存儲過程不能將值傳回調(diào)用的主程序B. 存儲過程是一個命名的模塊C. 編譯的存儲過程存放在數(shù)據(jù)庫中D. 一個存儲過程可以調(diào)用另一個存儲過程5包中不
42、能包含的元素為( )。A. 存儲過程 B. 存儲函數(shù) C. 游標(biāo) D. 表,6下列有關(guān)包的使用,說法錯誤的是( )。A. 在不同的包內(nèi)模塊可以重名B. 包的私有過程不能被外部程序調(diào)用C. 包體中的過程和函數(shù)必須在包頭部分說明D. 必須先創(chuàng)建包頭,然后創(chuàng)建包體,二、編程題1編寫程序包,此程序包有兩個過程和一個函數(shù),第一個過程根據(jù)職員編號打印職員姓名,第二個過程根據(jù)職員編號打印職員的部門編號。函數(shù)根據(jù)職員編號返回職員的薪水。提示:使用scott用戶的emp表作為數(shù)據(jù)源。2編寫函數(shù)接受學(xué)生的學(xué)號,并計算該學(xué)生3門課程的總分。3編寫一個過程,將10號部門員工薪水上漲10%,20號部門員工薪水上漲20%
43、,其他部門員工薪水保持不變。,上機(jī)實驗七 實驗1 過程目的和要求:1掌握編寫過程的方法。2掌握調(diào)用過程的方法。實驗內(nèi)容:編寫一個過程,要求根據(jù)用戶輸入的員工號(emp_no)查詢EMP表,返回員工的姓名和工作職位(empName和empJob)。并編寫一個匿名塊調(diào)用此過程(使用SCOTT用戶的EMP表)。,SQL create or replace procedure pro_emp(emp_no number) 2 as 3 empName varchar2(20); 4 empJob varchar2(20); 5 begin 6 select ename,job into empName
44、,empJob from emp where empno=emp_no; 7 DBMS_OUTPUT.PUT_LINE(雇員的姓名是:|empName); 8 DBMS_OUTPUT.PUT_LINE(雇員的職位是:|empJob); 9 EXCEPTION 10 when NO_DATA_FOUND then 11 DBMS_OUTPUT.PUT_LINE(雇員編號未找到!); 12 end pro_emp; 13 /,過程已創(chuàng)建。SQL set serveroutput on;SQL execute pro_emp(7369);雇員的姓名是:SMITH雇員的職位是:CLERKPL/SQL
45、過程已成功完成。,實驗2 函數(shù)目的和要求:1掌握編寫函數(shù)的方法。2掌握調(diào)用函數(shù)的方法。,實驗內(nèi)容:1編寫函數(shù)以接受學(xué)生的學(xué)號,并計算此學(xué)生3門課程的平均分。SQL create or replace function fun_score(student_no number) 2 return float 3 as 4 s1 float(10); 5 s2 float(10); 6 s3 float(10); 7 score_avg float(10); 8 begin 9 select oracle,java,csharp into s1,s2,s3 from score where stuID=student_no;,10 score_avg:=(s1+s2+s3)/3.0; 11 return score_avg; 12 EXCEPTION 13 when NO_DATA_FOUND then 14 DBMS_OUTPUT.PUT_LINE(學(xué)號未找到!); 15 end ; 16 /函數(shù)已創(chuàng)建。SQL set serveroutput
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物化學(xué)研究的術(shù)語表達(dá)與學(xué)術(shù)溝通
- 生物制劑在難治性職業(yè)性皮炎中的應(yīng)用
- 生物3D打?。浩鞴僖浦残g(shù)后免疫微環(huán)境優(yōu)化方案-1
- 生活方式干預(yù)延緩癡呆的證據(jù)
- 生態(tài)位模型在肝膽疾病中的風(fēng)險分層策略
- 瓣膜匹配優(yōu)化與抗凝治療方案的協(xié)同
- 環(huán)境正義視角下弱勢群體慢性病防控的環(huán)境干預(yù)策略-1-1
- 文化創(chuàng)意產(chǎn)業(yè)項目評估與投資手冊
- 2026年及未來5年中國羅漢果茶行業(yè)市場全景監(jiān)測及投資前景展望報告
- 2025年智慧農(nóng)業(yè)物聯(lián)網(wǎng)技術(shù)應(yīng)用與投資分析報告
- 券商投行部述職報告
- 金風(fēng)-綠電新政下風(fēng)電資產(chǎn)產(chǎn)銷一體新范式
- 2026屆湖南長沙一中高一生物第一學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測試題含解析
- PDLC薄膜性能的研究
- 一級2026年注冊建筑師之設(shè)計前期與場地設(shè)計考試題庫300道附參考答案【黃金題型】
- 三方協(xié)議書就業(yè)協(xié)議書
- 排水管網(wǎng)疏通與養(yǎng)護(hù)技術(shù)方案
- 肝內(nèi)膽管惡性腫瘤護(hù)理查房
- 2025-2026學(xué)年浙教版(2023)初中信息科技七年級上冊教學(xué)計劃及進(jìn)度表
- 昆明醫(yī)科大學(xué)海源學(xué)院《高等數(shù)學(xué)下》2024-2025學(xué)年第一學(xué)期期末試卷
- 中國特發(fā)性面神經(jīng)麻痹(面癱)治療指南(2022)解讀
評論
0/150
提交評論