oracle创建删除存储过程参数传递创建删除存储函数存储过程和函数的查看包系统包Word格式.docx
《oracle创建删除存储过程参数传递创建删除存储函数存储过程和函数的查看包系统包Word格式.docx》由会员分享,可在线阅读,更多相关《oracle创建删除存储过程参数传递创建删除存储函数存储过程和函数的查看包系统包Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
*像其他高级语言的过程和函数一样,可以传递参数给存储过程或函数,参数的传递也有多种方式。
存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;
函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。
存储过程和函数需要进行编译,以排除语法错误,只有编译通过才能调用。
创建和删除存储过程
创建存储过程,需要有CREATEPROCEDURE或CREATEANYPROCEDURE的系统权限。
该权限可由系统管理员授予。
创建一个存储过程的基本语句如下:
CREATE[ORREPLACE]PROCEDURE存储过程名[(参数[IN|OUT|INOUT]数据类型...)]
{AS|IS}
[说明部分]
BEGIN
可执行部分
[EXCEPTION
错误处理部分]
END[过程名];
其中:
SELECTCOUNT(*)INTOV_TOTALFROMEMP;
DBMS_OUTPUT.PUT_LINE('
雇员总人数为:
'
||V_TOTAL);
END;
CREATEORREPLACEPROCEDUREEMP_COUNT
AS
V_TOTALNUMBER(10);
BEGIN
SELECTCOUNT(*)INTOV_TOTALFROMEMP;
DBMS_OUTPUT.PUT_LINE('
步骤3:
按&
#8220;
执行&
#8221;
按钮进行编译。
如果存在错误,就会显示:
警告:
创建的过程带有编译错误。
如果存在错误,对脚本进行修改,直到没有错误产生。
如果编译结果正确,将显示:
Sql代码
过程已创建。
步骤4:
调用存储过程,在输入区中输入以下语句并执行:
EXECUTEEMP_COUNT;
显示结果为:
14
PL/SQL过程已成功完成。
14
PL/SQL过程已成功完成。
说明:
在该训练中,V_TOTAL变量是存储过程定义的局部变量,用于接收查询到的雇员总人数。
注意:
在SQL*Plus中输入存储过程,按&
按钮是进行编译,不是执行存储过程。
如果在存储过程中引用了其他用户的对象,比如表,则必须有其他用户授予的对象访问权限。
一个存储过程一旦编译成功,就可以由其他用户或程序来引用。
但存储过程或函数的所有者必须授予其他用户执行该过程的权限。
存储过程没有参数,在调用时,直接写过程名即可。
【训练2】在PL/SQL程序中调用存储过程。
步骤1:
登录SCOTT账户。
步骤2:
授权STUDENT账户使用该存储过程,即在SQL*Plus输入区中,输入以下的命令:
GRANTEXECUTEONEMP_COUNTTOSTUDENT
GRANTEXECUTEONEMP_COUNTTOSTUDENTSql代码
授权成功。
登录STUDENT账户,在SQL*Plus输入区中输入以下程序:
SETSERVEROUTPUTON
BEGIN
SCOTT.EMP_COUNT;
END;
SETSERVEROUTPUTON
SCOTT.EMP_COUNT;
执行以上程序,结果为:
说明:
在本例中,存储过程是由SCOTT账户创建的,STUDEN账户获得SCOTT账户的授权后,才能调用该存储过程。
注意:
在程序中调用存储过程,使用了第二种语法。
【训练3】编写显示雇员信息的存储过程EMP_LIST,并引用EMP_COUNT存储过程。
在SQL*Plus输入区中输入并编译以下存储过程:
CREATEORREPLACEPROCEDUREEMP_LIST
AS
CURSORemp_cursorIS
SELECTempno,enameFROMemp;
FOREmp_recordINemp_cursorLOOP
DBMS_OUTPUT.PUT_LINE(Emp_record.empno||Emp_record.ename);
ENDLOOP;
EMP_COUNT;
CREATEORREPLACEPROCEDUREEMP_LIST
CURSORemp_cursorIS
SELECTempno,enameFROMemp;
FOREmp_recordINemp_cursorLOOP
DBMS_OUTPUT.PUT_LINE(Emp_record.empno||Emp_record.ename);
ENDLOOP;
EMP_COUNT;
执行结果:
EXECUTEEMP_LIST
EXECUTEEMP_LIST
7369SMITH
7499ALLEN
7521WARD
7566JONES
执行结果:
雇员总人数为:
7369SMITH
7499ALLEN
7521WARD
7566JONES
以上的EMP_LIST存储过程中定义并使用了游标,用来循环显示所有雇员的信息。
然后调用已经成功编译的存储过程EMP_COUNT,用来附加显示雇员总人数。
通过EXECUTE命令来执行EMP_LIST存储过程。
【练习1】编写显示部门信息的存储过程DEPT_LIST,要求统计出部门个数。
参数传递
参数的作用是向存储过程传递数据,或从存储过程获得返回结果。
正确的使用参数可以大大增加存储过程的灵活性和通用性。
参数的类型有三种,如下所示。
IN定义一个输入参数变量,用于传递参数给存储过程
OUT定义一个输出参数变量,用于从存储过程获取数据
INOUT定义一个输入、输出参数变量,兼有以上两者的功能
IN定义一个输入参数变量,用于传递参数给存储过程
OUT定义一个输出参数变量,用于从存储过程获取数据
INOUT定义一个输入、输出参数变量,兼有以上两者的功能
参数的定义形式和作用如下:
参数名IN数据类型DEFAULT值;
定义一个输入参数变量,用于传递参数给存储过程。
在调用存储过程时,主程序的实际参数可以是常量、有值变量或表达式等。
DEFAULT关键字为可选项,用来设定参数的默认值。
如果在调用存储过程时不指明参数,则参数变量取默认值。
在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值。
参数名OUT数据类型;
定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序。
在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。
在存储过程中,参数变量只能被赋值而不能将其用于赋值,在存储过程中必须给输出变量至少赋值一次。
参数名INOUT数据类型DEFAULT值;
定义一个输入、输出参数变量,兼有以上两者的功能。
在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。
在存储过程中必须给变量至少赋值一次。
如果省略IN、OUT或INOUT,则默认模式是IN。
【训练1】编写给雇员增加工资的存储过程CHANGE_SALARY,通过IN类型的参数传递要增加工资的雇员编号和增加的工资额。
步骤2:
在SQL*Plus输入区中输入以下存储过程并执行:
CREATEORREPLACEPROCEDURECHANGE_SALARY(P_EMPNOINNUMBERDEFAULT7788,P_RAISENUMBERDEFAULT10)
V_ENAMEVARCHAR2(10);
V_SALNUMBER(5);
SELECTENAME,SALINTOV_ENAME,V_SALFROMEMPWHEREEMPNO=P_EMPNO;
UPDATEEMPSETSAL=SAL+P_RAISEWHEREEMPNO=P_EMPNO;
雇员'
||V_ENAME||'
的工资被改为'
||TO_CHAR(V_SAL+P_RAISE));
COMMIT;