ORACLE Procedure存储过程语法
ORACLE Procedure存储过程语法子程序和程序包总结:子程序是命名的PL/SQL块,可带参数并可在需要时随时调用。PL/SQL有两种类型的子程序,即过程和函数。过程用于执行特定的任务,函数用于执行任务并返回值。程序包是对相关类型、变量、常量、游标、异常、过程和函数的封装。程序包由包规范和包主体两部分组成。包规范是包的接口,包含公用对象及其类型。包主体实现包规范中的游标和子程序,包主体中的声明仅限于在包内使用。程序包中游标的定义分为游标规范和游标主体两部分。语法及示例:1、存储过程创建存储过程的语法:CREATE [OR REPLACE] PROCEDURE procedure_name[(parameter_list)]{IS|AS}[local_declarations]BEGINexecutable_statements[EXCEPTIONexception_handlers]END [procedure_name];其中:procedure_name是过程的名称。parameter_list是参数列表。local_declarations是局部声明。executable_statements是可执行语句。exception_handlers是异常处理程序。示例1:演示创建过程(参数列表中为IN参数赋予一个默认值,不能为OUT、IN OUT参数赋予默认值)create or replace procedure find_emp(emp_no in number:=7900)asempname varchar2(20);beginselect ename into empname from emp where empno=emp_no;dbms_output.put_line('雇员姓名是 '||empname);exceptionwhen no_data_found thendbms_output.put_line('雇员编号未找到');end find_emp;调用过程:EXECUTE procudure_name(parameters_list);也可以在过程里面调用,直接写上procudure_name而不必写EXECUTE。示例2:演示创建带OUT参数的过程create or replace procedure test(value1 varchar2,value2 out number)isidentity number;beginselect sal into identity from emp where empno=value1;if identity<2000 thenvalue2:=1000;elsevalue2:=500;end if;end;调用带OUT参数的过程:declarevalue2 number;begintest('7900',value2);dbms_output.put_line(value2);end;示例3:演示创建带IN OUT参数的过程create or replace procedure swap(p1 in out number,p2 in out number)isv_temp number;beginv_temp:=p1;p1:=p2;p2:=v_temp;end;调用带IN OUT参数的过程:declarenum1 number:=100;num2 number:=200;beginswap(num1,num2);dbms_output.put_line('num1= '||num1);dbms_output.put_line('num2= '||num2);end;示例4:将过程的执行权限授予其他用户GRANT EXECUTE ON find_emp TO scott;GRANT EXECUTE ON swap TO PUBLIC;将find_emp过程的执行权限授予给用户scott,将执行swap过程的权限授予所有数据库用户。删除过程语法:DROP PROCEDURE procudure_name;2、函数定义函数的语法如下:CREATE [OR REPLACE] FUNCTION function_name[(parameter_list)]RETURN datatype{IS|AS}[local_declarations]BEGINexecutable_statements[EXCEPTIONexception_handlers]END [function_name];其中:function_name是函数的名称。parameter_list是参数列表。local_declarations是局部声明。executable_statements是可执行语句。exception_handlers是异常处理程序。使用函数时注意:形式参数必须只使用数据库类型,不得使用PL/SQL类型。函数的返回类型也必须是数据库类型。函数不能单独执行,只能通过SQL语句或PL/SQL程序块来调用。示例5:演示如何创建函数create or replace function fun_helloreturn varchar2 isbeginreturn '朋友,您好';end;调用函数:select fun_hello from dual;函数的授权:同过和的授权一样具体请看示例4。删除函数:DROP FUNCTION function_name过程和函数的差异过程 函数作为PL/SQL语句执行 作为表达式的一部分调用在规范中不包含RETURN子句 必须在规范中包含RETURN子句不返回任何值 必须返回单个值可以包含RETURN语句,但是与函数不同,它不能用于返回值 必须包含至少一条RETURN语句3、程序包创建包规范的语法:CREATE [OR REPLACE] PACKAGE package_nameIS|AS[Public type and item declarations][Subprogram specifications]END [package_name];其中:package_name是包的名称。Public type and item declarations是声明类型、常量、变量、异常和游标等。Subprogram specifications声明PL/SQL子程序。示例6:演示创建程序包规范create or replace package pack_op isprocedure pro_print_ename(id number);procedure pro_print_sal(id number);function fun_re_date(id number) return date;end;创建包主体的语法:CREATE [OR REPLACE] PACKAGE BODY package_nameIS|AS[Public type and item declarations][Subprogram bodies][BEGINInitialization_statements]END [package_name];其中:package_name是包的名称。Public type and item declarations是声明类型、常量、变量、异常和游标等。Subprogram bodies是定义公共和私有PL/SQL子程序。示例7:演示创建程序包主体create or replace package body pack_op isprocedure pro_print_ename(id number) isname emp.ename%type;beginselect ename into name from emp where empno=id;dbms_output.put_line('职员姓名:'||name);end pro_print_ename;procedure pro_print_sal(id number) issalary emp.sal%type;beginselect sal into salary from emp where empno=id;dbms_output.put_line('职员工资:'||salary);end pro_print_sal;function fun_re_date(id number) return date isbedate emp.hiredate%type;beginselect hiredate into bedate from emp where empno=id;return bedate;end fun_re_date;end pack_op;示例8:调用程序包中创建的过程和函数exec pack_op.pro_print_ename(7900);exec pack_op.pro_print_sal(7900);select pack_op.fun_re_date(7900) from dual;示例9:演示程序包中的游标创建包规范create or replace package pack_emp iscursor cur_emp return emp%rowtype;procedure pro_cur;end pack_emp;创建包主体create or replace package body pack_emp iscursor cur_emp return emp%rowtype isselect * from emp;procedure pro_cur isrec_emp emp%rowtype;beginopen cur_emp;loopfetch cur_emp into rec_emp;exit when cur_emp%notfound;if rec_emp.sal<1000 thendbms_output.put_line('员工工资:'||rec_emp.sal||',需加倍努力争取提高工资');elsif rec_emp.sal>=1000 and rec_emp.sal<2000 thendbms_output.put_line('员工工资:'||rec_emp.sal||',工资一般,争取搞个部门经理做做');elsedbms_output.上一个:Oracle函数面试题
下一个:动态SQL现实一个表中求多列的和
- 更多Oracle疑问解答:
- 运行exp备份oracle数据库提示oracle-12154错误
- 有没有,生产Oracle Rman 备份脚本的工具啊!
- 初学orcle,希望有大大帮忙解说一下详细步骤,从登录oracle到创建表的过程
- oracle语句问题:一张user表,三个字段,id,name,time,插入记录比如:张三2007,李四2008,张三2011
- 如何写一个ORACLE触发器同步两个表中的数据?
- oracle 如何查看一个服务器上有多少个数据库.
- oracle 创建包的时候错误 求解
- oracle 重复列的问题
- oracle 中如何查处2星期前的数据
- 请教oracle数据库安装中的问题
- 请问谁能提供给我标准的oracle ERP的数据库表结构并详细说明各表主要的作用?
- 安装oracle遇到的问题 invalid entry CRC (expected 0x3e12e795 but got 0x9db0e9fd)
- 我的是ORACLE 10G,在RMAN中如何按指定的时间恢复数据文件啊?
- oracle为什么没有自动增长列
- oracle快捷键都有哪些啊?