第7章-1 存储过程
在第6章的内容中,学习过PL模块化的编程。格式如下 Declare 变量声明 Begin 数据处理 Exception 异常处理 End; /
PL模块是一种没有名字的模块,每一次调用这个模块都要将上述代码重新复制和粘贴一遍。因此我们希望给模块起一个名字,每次调用只需要输入模块的名字就可以。存储过程就是有名字的模块,调用该模块的时候只需输入模块的名字,大大方便了模块的调用。
1. 存储过程的的定义:
Create or replace procedure + 名字 + is 变量定义 Begin 数据处理 Exception 异常处理 End; /
可以看到,存储过程的定义和PL模块的定义非常类似,只是在第1句中加入了模块的名字。
如下的操作能够定义一个存储过程,实现以下功能: 在emp表中,查询SMITH的员工编号,将结果赋给自己定义的变量并将变量内容输出出来。
定义一个数字变量 a 查询SMITH的员工编号, 并将结果保存至自己定义的变量
代码:
create or replace procedure pro1 is a number; begin
select empno into a
from emp where ename= 'SMITH'; dbms_output.put_line(a); end;
/
结果截图:
2. 存储过程的调用(在PL模块中调用):
Declare
Begin 模块名; End; /
对于上面建立的存储过程pro1,我们可以按如下调用:
在PL模块中输入存储过程的名字即能调用。
代码:
结果截图:
请模仿上面的过程定义一个存储过程,要求实现下面功能:查询编号7499的工资,将结果保存至变量并且输出出来。定义存储过程之后,在PL模块中调用它。 代码:
create procedure pro2 is b number; begin
select sal into b
from emp where empno = 7499; dbms_output.put_line(b); end; /
set serveroutput on; declare begin pro2(); end; /
结果截图:
请模仿上面的过程定义一个存储过程,要求实现下面功能:查询所有职位为’MANAGER’的员工信息,将结果保存至变量并且输出出来。定义存储过程之后,在PL模块中调用它。 注意:如忘记多行结果如何保存至变量,请查看第6章-3的内容。 代码:
create or replace procedure pro3 is begin
for empRio in (select * from emp where job = 'MANAGER')loop
dbms_output.put_line('no:'||empRio.empno||','||'name:'||empRio.ename); end loop; end; /
set serveroutput on; declare begin pro3(); end; /
结果截图:
带参数的存储过程
上面的存储过程没有输入输出参数,模块所执行的功能是固定的,无法根据实际情况去改变。 我们希望建立一个存储过程,带有输入输出参数:我们希望模块执行的内容可以通过输入参数输入,而模块执行的结果则通过输出参数输出。
3.输入变量。变量的定义:名字+类型,而存储过程输入变量的定义过程:名字+ in + 类
型。如为存储过程定义一个输入变量,类型为数字,可以如下定义: a in number (注意:输入变量不能指定长度,所以像 a in number(4,1) 这样的定义是无效的)。 如为存储过程定义一个输入变量b,类型为字符串,应当如何定义 ? 答:b in varchar2 如为存储过程定义一个输入变量c,类型为日期,应当如何定义? 答:c in to_data
4.带输入变量的存储过程。使用 create or replace procedure + 模块名字(输入变量) +
is …即可定义一个带输入变量的存储过程。调用存储过程时,程序会按照我们输入的变量去运行。
如下的操作可以定义一个存储过程,它让我们输入一个编号,运行时会搜索该编号的员工信息。
该注释解释了存储过程的功能 Empno1是我们输入的员工编号
代码:
create or replace procedure por1(empno1 in number) is row emp%rowtype; begin
select * into row from emp where empno = empno1; dbms_output.put_line (row.empno||','||row.ename); end; /
结果截图: 如下的操作让我们调用上面的定义的存储过程。(注意:存储过程调用是在PL模块中进行)
调用存储过程只需在PL模块中输入存储过程的名字即可 由于该过程需要输入编号,所以此处输入编号7369
代码:
set serveroutput on declare begin
por1(7369); end; /
结果截图:
请模仿上面的步骤完成下列要求:
(1)创建一个存储过程pro2,调用时我们输入一个职位(职位有CLERK, SALESMAN, PRESIDENT, MANAGER, ANALYST), 该存储过程会搜索所有该职位的员工信息并且将每位员工的编号和姓名输出出来。(注意:此题的思路是,查询出来有多行数据,在for 循环中依次将每一行数据保存到行变量,并且将行变量中的员工编号和姓名输出)。 (2)调用该存储过程时,输入’MANAGER’去搜索该职位的信息。 代码:
结果截图:
思考:上面的题目我们建立了一个存储过程pro2, 调用时我们输入一个职位,它会搜索该职
位的所有员工。请按要求扩展该模块的功能:
(1)在定义存储过程中加入一个检测过程,如果输入的职位不是(CLERK, SALESMAN, PRESIDENT, MANAGER, ANALYST)其中之一,则输出信息’输入的职位不对’;(注意:使用not in 指令即可判断字符床是否不再指定的范围之内)
(2)调用存储过程的时候,输入职位’happy’,查看存储过程的输出。 代码:
结果截图:
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库oracle第7章-1在线全文阅读。
相关推荐: