子程序是已经命名的PLSQL块,他们存储在数据库中,可以为他们指定参数,可以在客户端和应用程序中调用它们。子程序包括存储过程和函数,程序包是存储过程和函数的集合。存储过程--语法:CREATE[ORREPLACE]PROCEDUREprocedure_name[(parameter_list)]{IS|AS}[local_declarations]BEGINexecutable_statements[EXCEPTIONexception_handlers]END[procedure_name];语法说明:procedure_name是过程名字parameter_list是参数列表local_declarations是局部声明executable_statements是可执行语句,execption_handlers是异常处理程序-------createorreplaceprocedurewyd_print(timesnumber)isinumber:=0;beginloopi:=i+1;DBMS_OUTPUT.PUT_LINE('第'||i||'次循环!!');exitwheni=times;endloop;end;/直接调用存储过程:execwyd_print(20)executewyd_print(30);过程参数模式调用程序是通过参数向被调用的过程传递值的。参数传递的模式有3种:IN,OUT,INOUT。也就是输入,输出,输入输出定义过程参数的语法:parameter_name[IN|OUT|INOUT]datatype[{:=|DEFAULT}expression]参数IN模式是默认模式如果要指定OUT|INOUT模式参数要明确指定---------实例:CREATEORREPLACEPROCEDUREmypar(aINnumber,bOUTnumber,cINOUTnumber)ISBEGINDBMS_OUTPUT.PUT_LINE('a--'||a);DBMS_OUTPUT.PUT_LINE('b--'||b);DBMS_OUTPUT.PUT_LINE('c--'||c);--a:=111;b:=222;c:=333;DBMS_OUTPUT.PUT_LINE('a--'||a);DBMS_OUTPUT.PUT_LINE('b--'||b);DBMS_OUTPUT.PUT_LINE('c--'||c);ENDmypar;/-----declareaanumber:=11;bbnumber:=22;ccnumber:=33;beginDBMS_OUTPUT.PUT_LINE('beforeaa--'||aa);DBMS_OUTPUT.PUT_LINE('beforebb--'||bb);DBMS_OUTPUT.PUT_LINE('beforecc--'||cc);mypar(aa,88,cc);DBMS_OUTPUT.PUT_LINE('afteraa--'||aa);DBMS_OUTPUT.PUT_LINE('afterbb--'||bb);DBMS_OUTPUT.PUT_LINE('aftercc--'||cc);end;/注意几点:(1)IN类型参数在过程中不能再给赋值(2)OUTINOUT类型可以进入后赋值。(3)OUT类型参数在调用过程传入参数时无效,(4)OUT,INOUT类型参数在调用过程时传入的必须是变量---------一个过程创建了,将执行权限授予其他用户语法:GRANTEXECUTEONprocedure_nameTOUSER_Name;//授权给特定用户执行过程的权限GRANTEXECUTEONprocedure_nameTOpublic;//授权给所有数据库用户执行过程的权限查看数据库里面的存储过程:selectobject_namefromuser_objectswhereobject_type='PROCEDURE';selectsubstr(object_name,1,20)object_name,object_typefromuser_objectswhereobject_type='PROCEDURE';selectsubstr(object_name,1,10)object_name,object_typefromuser_objects;删除一个过程:DROPprocedureprocedure_name;___________________________________________________________________________________函数的定义和使用________________________________________________________________________________________函数与过程相似,也是数据库中存储的已经命名的PL/SQL块。函数的主要特性:(1)必须有一个返回值(2)函数不能单独执行,只能通过SQL语句或者PL/SQL程序块来调用。函数定义--语法:CREATE[ORREPLACE]FUNCTIONfunction_name[(parameter1,parameter2...)]RETURNdatatype{IS|AS}[local_declarations]BEGINExexutable_Statements;[EXCEPTIONException_handlers;]END;/注意:(1)函数只能带有IN参数,而不能带有INOUT或OUT参数。(2)形式参数必须只能使用数据库类型,不能使用PL/SQL类型。(3)函数返回类型也必须是数据库类型。--------------创建一个函数:createorreplacefunctionfun_sum(anumber,bnumber)returnnumberISBEGINreturna+b;END;--------------通过SQL来执行函数:SELECTfunction_name[(parameter1,parameter2...)]FROMDUAL;selectfun_sum(5,6)fromdual;--------------查看数据库里面的用户创建的函数:selectobject_namefromuser_objectswhereobject_type='FUNCTION';selectsubstr(object_name,1,20)object_name,object_typefromuser_objectswhereobject_type='FUNCTION';--------------函数的授权:GRANTEXECUTEONfunction_nameTOUSER_Name;//函数的使用权授予特定的用户GRANTEXECUTEONfunction_nameTOpublic;//函数的使用权授予数据库中所有用户example:GRANTEXECUTEONfun_sumtopublic;--------------***自主事务处理自主事务处理是有另一个事务处理(主事务处理)启动的独立事务处理。举例://P1就是自主事务处理CREATEORREPLACEPROCEDUREp1ASPRAGMAAUTONOMOUS_TRANSACTION;--就这句话,让事务处理独立开来了BEGINENDp1;/CREATEORREPLACEPROCEDUREp2ASBEGIN...p1;...ENDp2;/p2过程调用了P1过程,但是p1过程声明了事务独立,使得p1的运行对p2没有直接影响。删除一个函数:语法:DROPFUNCTIONFunction_name;Example:dropFUNCTIONfun_sum;----------------------------------------------------------------******************程序包的创建和使用****************----------------------------------------------------------------程序包是一种数据库对象,它是对相关PL/SQL类型,子程序,游标,异常,变量和常量的封装。创建一个程序包有两个步骤:(1)创建程序包规范。(也可以说成是‘声明程序包’)基本语法:CREATE[ORPEPLACE]PACKAGEpackage_nameIS|AS[publictypeanditemdeclarations][subprogramspecifications]END[package_name];/------------(2)创建程序包主体。(也可以说成是‘实现程序包’)基本语法:CREATE[ORREPLACE]PACKAGEBODYpackage_nameIS|AS[Publictypeanditemdeclarations][Subprogrambodies][BEGINInitialization_statements]END[package_name];package_namePublictypeanditemdeclarations声明变量,常量,游标,异常或者类型。Subprogrambodies定义公共和私有PL/SQL子程序------------------实际例子:(1)创建程序包规范:CREATEORREPLACEPACKAGEwyd_packageISPROCEDUREwyd_print(namevarchar2);FUNCTIONwyd_sum(anumber,bnumber)returnnumber;ENDwyd_package;(2)创建程序包主体:CREATEORREPLACEPACKAGEBODYwyd_packageAS--实现wyd_print存储过程PROCEDUREwyd_print(namevarchar2)ISBEGINDBMS_OUTPUT.PUT_LINE('Hello,'||name);ENDwyd_print;--实现wyd_sum函数FUNCTIONwyd_sum(anumber,bnumber)RETURNNUMBERISBEGINreturna+b;ENDwyd_sum;ENDwyd_package;-----------调用创建的包中的存储过程和函数setserveroutputonexecwyd_package.wyd_print('WangYuDong');selectwyd_package.wyd_sum(12,55)fromdual;-----------查看数据库里面的用户创建的程序包:selectobject_namefromuser_objectswhereobject_type='PACKAGE';selectsubstr(object_name,1,20)object_name,object_typefromuser_objects;selectsubstr(object_name,1,20)object_name,object_typefromuser_objectswhereobject_type='PACKAGE';删除一个程序包:语法:DROPPACKAGEPACKAGE_name;Example:droppackagewyd_package;declareparam_outvarchar2(28);param_inoutvarchar2(28);beginparam_inout:='ff';proce_test('dd',param_out,param_inout);dbms_output.put_line(param_out);end;c#调用oracle存储过程返回数据集SQL/Oracle2008-12-0523:00:46阅读834评论0