问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Oracle 简单过程与函数的创建 以及二者区别

发布网友 发布时间:2022-04-07 21:20

我来回答

2个回答

懂视网 时间:2022-04-08 01:41

过程函数编程

实践目的

  (1) 掌握存储过程、存储函数高级数据库对象的基本作用。

  (2) 掌握存储过程、存储函数的建立、修改、查看、删除操作。

实践要求

  (1) 记录执行命令和操作过程中遇到的问题及解决方法,注意从原理上解释原因。

  (2) 记录利用企业管理器管理存储过程、存储函数、触发器的方法。

  (3) 记录利用SQL*Plus和PLSQL DEVELOPER管理存储过程、存储函数的命令。

实践内容

  下列任务中涉及的数据表是SCOTT用户给出的表。

  1.创建存储过程

(1) 获取某部门雇员的姓名和工资。  

(2) 获取某部门的工资总和及部门名称。

  (3)输出某个部门员工的姓名及工资档次,5000以上高,3000-5000中等,2000-3000较低,2000以下低。

  2.创建存储函数

(1) 获取某雇员的工资:  

(2) 获取某部门的工资总和。

(3) 输出某个员工的姓名及工资档次,5000以上高,3000-5000中等,2000-3000较低,2000以下低。

(4)计算指定部门的工资总和,并统计其中的职工数量。

实验步骤:

下列任务中涉及的数据表是SCOTT用户给出的表。

  1.创建存储过程

(1) 获取某部门雇员的姓名和工资。 

SQL> conn scott/tiger

已连接。

SQL> set serveroutput on;

SQL> create or replace procedure emp_table(e_deptno emp.deptno%type)

  2  as

  3       cursor e_cursor is

  4       select ename,sal from emp where deptno=e_deptno;

  5  begin

  6       for e_record in e_cursor loop

  7          dbms_output.put_line(e_record.ename||‘ ‘||e_record.sal);

  8       end loop;

  9  end;

 10  /

 

过程已创建。

 

SQL> exec emp_table(20);

SMITH 800

JONES 2975

SCOTT 3000

ADAMS 1100

FORD 3000

 

SQL> exec emp_table(10);

CLARK 2450

KING 5000

MILLER 1300

 

PL/SQL 过程已成功完成。

PL/SQL 过程已成功完成。

 

SQL> exec emp_table(30);

ALLEN 1600

WARD 1250

MARTIN 1250

BLAKE 2850

TURNER 1500

JAMES 950

 

PL/SQL 过程已成功完成。

 

SQL>

 

 

 

(2) 获取某部门的工资总和及部门名称。

 

 

SQL> create or replace procedure emp_1(e_deptno emp.deptno%type)

  2  as

  3       cursor emp_cur is

  4     select deptno,sum(sal) as e_sal from emp where deptno=e_deptno group by    deptno;

  5  begin

  6       for emp_record1 in emp_cur loop

  7       dbms_output.put_line(emp_record1.deptno||‘ ‘||emp_record1.e_sal);

  8       end loop;

  9  end;

 10  /

 

过程已创建。

 

SQL> exec emp_1(10);

10 8750

 

PL/SQL 过程已成功完成。

 

SQL> exec emp_1(20);

20 10875

 

PL/SQL 过程已成功完成。

 

SQL> exec emp_1(30);

30 9400

 

PL/SQL 过程已成功完成。

 

SQL> 

 

 

(3)输出某个部门员工的姓名及工资档次,5000以上高,3000-5000中等,2000-3000较低,2000以下低。

SQL> create or replace procedure empno_name_level

  2  (dnum in emp.empno%type,name out emp.ename%type,level out varchar2)

  3  as

  4  salary emp.sal%type;

  5  begin

  6     select sal,ename into salary,name from emp where dnum=empno;

  7     case

  8     when salary >5000 then level:=‘高‘;

  9     when salary between 3000 and 5000 then level:=‘中等‘;

 10     when salary between 2000 and 3000 then level:=‘较低‘;

 11     else  level:=‘低‘;

 12     end case;

 13  end;

 14  /

 

过程已创建。

 

SQL> declare

  2  level varchar2(15);

  3  name emp.ename%type;

  4  begin

  5  empno_name_level(‘7788‘,name,level);

  6  dbms_output.put_line(‘name:‘||name||‘ ‘||‘level:‘||level);

  7   end;

  8  /

name:SCOTT level:中等

 

PL/SQL 过程已成功完成。

 

 

 

  2.创建存储函数

(1) 获取某雇员的工资:  

 

SQL> create or replace function empno_sal(eno in emp.empno%type)

  2  return emp.sal%type

  3  as

  4  salary emp.sal%type;

  5  begin

  6     select sal into salary from emp where eno=empno;

  7     return salary;

  8  end;

  9  /

 

函数已创建。

 

SQL> begin

  2     dbms_output.put_line(‘salary:‘||emp_sal(‘7499‘));

  3  end;

  4  /

salary:1600

 

PL/SQL 过程已成功完成。

 

SQL>  begin

  2      dbms_output.put_line(‘salary:‘||emp_sal(‘7788‘));

  3  end;

  4  /

salary:3000

 

PL/SQL 过程已成功完成。

 

SQL>  begin

  2      dbms_output.put_line(‘salary:‘||emp_sal(‘7900‘));

  3  end;

  4  /

salary:950

 

PL/SQL 过程已成功完成。

   

 

(2) 获取某部门的工资总和。

 

SQL> create or replace function salary_num(dno in emp.deptno%type)

  2  return emp.sal%type

  3  is

  4  total emp.sal%type;

  5  begin

  6     select sum(sal) into total from emp where         dno=deptno;

  7     return total;

  8  end;

  9  /

 

函数已创建。

 

SQL> begin

  2    dbms_output.put_line(‘total_salary:‘||total_salary(‘20‘));

  3  end;

  4  /

total_salary:10875

 

PL/SQL 过程已成功完成。

 

SQL> begin

  2    dbms_output.put_line(‘total_salary:‘||total_salary(‘10‘));

  3  end;

  4  /

total_salary:8750

 

PL/SQL 过程已成功完成。

 

SQL> begin

  2    dbms_output.put_line(‘total_salary:‘||total_salary(‘30‘));

  3  end;

  4  /

total_salary:9400

 

PL/SQL 过程已成功完成。

   

 

(3) 输出某个员工的姓名及工资档次,5000以上高,3000-5000中等,2000-3000较低,2000以下低。

 

SQL> create or replace function empno_name_level1(dnum in emp.empno%type,name out emp.ename%type)

  2  return varchar2

  3  as

  4  salary emp.sal%type;

  5  level varchar2(15);

  6  begin

  7     select sal,ename into salary,name from emp where                dnum=empno;

  8     case

  9     when salary >5000 then level:=‘高‘;

 10     when salary between 3000 and 5000 then level:=‘中等‘;

 11     when salary between 2000 and 3000 then level:=‘较低‘;

 12     else  level:=‘低‘;

 13     end case;

 14     return level;

 15  end;

 16  /

 

函数已创建。

 

SQL> declare

  2     name emp.ename%type;

  3     level varchar2(15);

  4  begin

  5     level:=empno_name_level1(‘7499‘,name);

  6     dbms_output.put_line(‘name:‘||name||‘ ‘||‘level:‘||level);

  7  end;

  8  /

name:ALLEN level:低

 

PL/SQL 过程已成功完成。

 

SQL> declare

  2     name emp.ename%type;

  3     level varchar2(15);

  4  begin

  5     level:=empno_name_level1(‘7788‘,name);

  6      dbms_output.put_line(‘name:‘||name||‘ ‘||‘level:‘||level);

  7   end;

  8   /

name:SCOTT level:中等

 

PL/SQL 过程已成功完成。

 

SQL>  declare

  2      name emp.ename%type;

  3      level varchar2(15);

  4   begin

  5      level:=empno_name_level1(‘7566‘,name);

  6      dbms_output.put_line(‘name:‘||name||‘ ‘||‘level:‘||level);

  7   end;

  8  /

name:JONES level:较低

 

PL/SQL 过程已成功完成。

 

 

(4)计算指定部门的工资总和,并统计其中的职工数量。

SQL> create or replace function salnum_empnonum(dnum in emp.deptno%type,total out emp.sal%type)

  2  return number

  3  as

  4  e_count number;

  5  begin

  6     select sum(sal),count(empno)

  7           into total,e_count from emp                        where deptno=dnum;

  8     return e_count;

  9  end;

 10  /

 

函数已创建。

 

SQL> declare

  2  total emp.sal%type;

  3  begin

  4  dbms_output.put_line(‘enum:‘||salnum_empnonum(‘10‘,total)||‘‘||‘total:‘||total);

  5  end;

  6  /

enum:3total:8750

 

PL/SQL 过程已成功完成。

 

 

 

实验小结:

1. PL/SQL中的存储子程序包括存储过程和(存储)函数两种。存储子程序是以独立对象的形式存储在数据库服务器中,因此是一种全局结构,与之对应的是局部子程序,即嵌套在PL/SQL块中的局部过程和函数,其存储位置取决于其所在的父块的位置。

2. 存储过程可以简单的理解为一段可以执行某个活动/动作的子程序,可以作为一个系统对象被存储在数据库中,可以重复调用。

3. 通常,存储过程不需要返回值,如果需要返回一个值可以通过函数调用实现。但是,如果希望返回多个值,可以使用OUT或IN OUT模式参数来实现。

4. 在编译过程中可能会产生错误,可以使用SHOW ERRORS来查看错误信息。当前只有一个对象,要显示错误可以用SHOW ERRORS,当有多个对象时,可以精确的指明要查看那个对象,例如此处可写:SHOW ERRORS PROCEDURE myproc,同样的要查看函数、包、触发器的错误,用SHOW ERRORS FUNCTION/PACKAGE/TRIGER 名称。

5. 存储子程序是被命名的PL/SQL块,以编译的形式存储在数据库服务器中,可以在应用程序中进行调用,是PL/SQL程序模块化的一种体现。

 

 

 

oracle-过程函数编程

标签:

热心网友 时间:2022-04-07 22:49

1、函数必须有返回值,而过程可没有返回值
2、函数可以单独执行,而过程必须通过execute执行
3、函数可以嵌入到sql中执行,而过程不行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见车轱辘差点轧脚上 老师回复家长的暖心话高情商回复 做梦梦到捡蚌壳且有很多蛇纹的 LG?G3官司方报价图片及参数 LG G3的屏幕尺寸为何达到2560x1440像素? 牙线挽救蛀牙 急!秦海璐演戏什么风格?演技如何? 我的电脑装过系统以后没有声音了,右下角的小喇叭还在请问是怎么... 中子星长什么样 中子星是一种什么样的恒星 雅思退款申请填写用电子档的话,身份证复印件和手写签名要怎么办 雅思什么时候可以退款 雅思如何退款 雅思报名费可以退吗 雅思官网退款按钮在哪 雅思退回考试费如何退? 雅思考试退考流程,考生须知 雅思考试报名之后,如果不想考了,怎么退费? 雅思退考是怎么退考费的 雅思考试取消是怎么退款的? 效能的基本含义 什么是效能? 上下之乌众行合效能组成什么词语 名词解释:效能 效能的名词解释 效益 效率 效果 效能前面分别用什么词 效果的效可以组什么词 效力的效组什么词 什么是DCS 计数器? 效能组什么词语 雅思报了名能退吗? 如何退考雅思考试 雅思如何转考退考,转退考费是多少? 不想考了,请问如何申请雅思退考并获得退款 雅思考试什么时候可以退费 雅思退考具体流程 报名雅思成功,又不想考了,可以退考吗 关于雅思办理退款 如何申请雅思退考并获得退款 储存什么白酒有价值 可以储存的白酒有哪些 淘宝返利是什么意思? 一淘里面返利是先付款,然后收货后卖家再归还部分金额吗? Led灯带上黑色的上面写着151是什么东西 关于一淘返利的问题 Led灯带有几个黑色点,那个带是不是不能剪 面碱是什么东西? Led灯带一头烧黑了,这段还能用吗 关于一淘返利的问题请详解。。。 LED灯带!哪种的好??