1.1.创建一个过程,能向dept表中添加一个新记录。(in参数)

  1. 创建过程
  2. create or replace procedure insert_dept
  3. ( num_dept in number, var_ename in varchar2, var_loc in varchar2 ) is
  4. begin
  5. insert into dept
  6. values(num_dept,var_ename,var_loc);
  7. commit;
  8. end insert_dept;
  9. /
  10. 调用
  11. begin
  12. insert_dept(79,'技术部','武汉');
  13. end;
  14. /

2.从scott.emp表中查询给定职工

(提示:使用&来输入员工编号)的职工姓名和工资。(要求:利用out模式的参数将值传给调用者。)

  1. 创建过程
  2. create or replace procedure select_emp(
  3. num_empno in emp.empno%type,
  4. name out emp.ename%type,
  5. salary out emp.sal%type) is
  6. begin
  7. select ename,sal into name,salary from emp where empno = num_empno;
  8. exception
  9. when no_data_found then
  10.     dbms_output.put_line('该部门不存在');
  11. end select_emp;
  12. /
  13. 调用
  14. declare
  15. var_name emp.ename%type,
  16. var_salary emp.sal%type) is
  17. begin
  18. select_emp(&员工编号,var_ename,var_salary);
  19. if var_ename is not null then
  20. dbms_output.put_line(var_ename||' '||var_salary);
  21. end if;
  22. end;
  23. /

3.创建一个过程,在执行调用过程时,可随机输入emp表中某个雇员的姓名,

根据雇员的姓名,返回该雇员的薪水值,并输出。(out参数)。

  1. 创建过程
  2. create or replace procedure select_emp2(
  3. name in emp.ename%type,
  4. salary out emp.sal%type) is
  5. begin
  6. select sal into salary from emp where ename = name;
  7. exception 
  8. when no_data_found then
  9. salary:=0;
  10. end select_emp2;
  11. /
  12. 调用
  13. declare
  14. var_sal number(5);
  15. begin
  16. select_emp2('&员工姓名',var_sal);
  17. dbms_output.put_line(var_sal);
  18. end;
  19. /

4.编写过程,实现交换两个变量的值的功能。并输出交换前和交换后的两个值。(in out参数)

  1. 创建过程
  2. create or replace procedure swap(
  3. num1 in out number,
  4. num2 in out number)
  5. is z number(5);
  6. begin
  7. z:=num1;
  8. num1:=num2;
  9. num2:=z;
  10. end swap;
  11. /
  12. 调用
  13. declare
  14. x number:=10;
  15. y number:=20;
  16. begin
  17. dbms_output.put_line('交换前x和y的值是:'||x||'  '||y);
  18. swap(x,y);
  19. dbms_output.put_line('交换后x和y的值是:'||x||'  '||y);
  20. END;
  21. /

5.创建存储过程,根据员工编号删除scott.emp表中的相关记录。

(提示:由调用语句提供的员工编号来删除记录,要求员工编号可随机输入。)

  1. 创建过程
  2. create or replace procedure delete_emp(id dept.empno%type) is
  3. begin
  4. Delete from dept where empno = id;
  5. end delete_emp;
  6. /
  7. 调用
  8. execute delete_emp('&员工编号');

6. 创建存储过程:输入部门编号,

输出scott.emp表中该部门所有职工的员工编号、姓名、工作岗位。

(提示:查询结果是多行,需使用游标,需把游标的定义像变量那样在过程或函数里定义,

所以游标的定义要放在如下位置:

  1. create or replace procedure 过程名(参数)is
  2.   游标的定义;
  3. begin
  4. end;
  5. /
  6. 创建过程
  7. create or replace procedure selcet_curemp( 
  8. id in emp.deptno%type) is
  9. cursor c1 is select * from emp where deptno = id;
  10. begin
  11. for rec in c1 loop
  12. dbms_output.put_line(rec.empno||' '||rec.empno||' '||rec.job);
  13. end loop;
  14. end;
  15. /
  16. 执行存储过程
  17. execute selcet_curemp(10);

7.编写一个过程,指定一个员工编号与一个工资增加的百分比,

使emp表中将该员工的工资(sal)增加输入的百分比。

  1. 创建过程
  2. create or replace procedure up_sal( id in number, parsent in float) is
  3. begin
  4. update emp set sal = sal + sal*parsent where empno = id;
  5. end;
  6. /
  7. begin
  8. up_sal(1234,0.5);
  9. end;
  10. /

8.创建函数,从scott.emp表中查询指定员工编号的职工的工资

  1. create or replace function select_sal(id emp.empno%type) return emp.sal%type is salary emp.sal%type;
  2. begin
  3. select sal into salary from emp where empno = id;
  4. return salary;
  5. end;
  6. /
  7. 调用函数有以下四种方式:
  8. 方式一:使用变量接收返回值
  9. VAR salary NUMBER;
  10. EXEC :salary:=select_sal(7369);
  11. PRINT salary;
  12. 方式二:在SQL语句中直接调用函数
  13. SELECT select_sal(7369) FROM DUAL;
  14. 方式三:使用DBMS_OUTPUT调用函数
  15. EXEC dbms_output.put_line('工资是:'|| select_sal(7369));
  16. 方式四:在匿名PL/SQL块中调用函数(推荐使用该种方式-方便好记)
  17. begin
  18. dbms_output.put_line('工资是:'|| select_sal(7369));
  19. end;
  20. /

9.创建函数,返回scott.emp表中指定职工的工资和姓名。

(提示:返回值是两个,可用return返回一个,另一个用out参数带回)

  1. create or replace function select_sal_name(id in emp.empno%type,v_name out emp.ename%type) 
  2. return emp.sal%type is salary emp.sal%type;
  3. begin
  4. select sal,ename into salary,v_name from emp where empno = id;
  5. return salary;
  6. end;
  7. /
  8. declare
  9. var_name emp.ename%type;
  10. var_sal emp.sal%type;
  11. begin
  12. var_sal:=select_sal_name(7369,var_name);
  13. dbms_output.put_line(var_name||'的工资为'||var_sal);
  14. end;
  15. /

10. 创建函数,根据给定的部门编号(提示: 利用&)计算该部门所有职工的平均工资。

  1. create or replace function avg_sal(id emp.deptno%type) return number is
  2. avgsal number(7,2);
  3. begin
  4. select avg(sal) into avgsal from emp where deptno = id;
  5. return avgsal;
  6. end;
  7. /
  8. begin
  9. dbms_output.put_line(avg_sal(&deptno));
  10. end;
  11. /

11.创建函数,将scott.emp表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数.

  1. create or replace function fun2 return number is
  2.  begin
  3.  update emp set sal=sal+200 where sal<(select avg(sal)  from emp);
  4.  return sql%rowcount;
  5.  end;
  6.  /
  7. begin
  8. dbms_output.put_line(fun2);
  9. end; 
  10. /

12.创建一个函数,仅有一个形参,它接收调用函数中传递过来的实参--部门号,

函数的返回值为该部门的一整条记录信息(注意:此处能够接收一整条记录的变量该怎么定义?)。要求在调用函数中输出该部门的部门名称与位置。

  1. create or replace function find_dept(dept_no number) return dept%rowtype
  2. is
  3. v_dept dept%rowtype;
  4. begin
  5. select * into v_dept from dept where deptno = dept_no;
  6. return v_dept;
  7. end;
  8. /
  9. declare
  10. v_dept dept%rowtype;
  11. begin
  12. v_dept:=find_dept(30);
  13. dbms_output.put_line(v_dept.dname||'---'||v_dept.loc);
  14. end;
  15. /

Oracle存储过程练习题的更多相关文章

  1. oracle 存储过程

    来自:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 I ...

  2. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  3. ORACLE存储过程调用Web Service

    1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sq ...

  4. Oracle存储过程基本语法介绍

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  5. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  6. Oracle存储过程(转)

    Oracle存储过程基本语法 存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR RE ...

  7. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  8. Oracle存储过程动态创建临时表/存储过程执行权限问题--AUTHID CURRENT_USER

    关于Oracle存储过程执行权限问题的解决 http://blog.sina.com.cn/s/blog_6ceed3280101hvlo.html (2014-04-02 04:06:28) 转载▼ ...

  9. ORACLE存储过程学习

    存储过程 1 CREATE OR REPLACE PROCEDURE 存储过程名 2 IS 3 BEGIN 4 NULL; 5 END; 行1: CREATE OR REPLACE PROCEDURE ...

随机推荐

  1. 使用腾讯云mysql的一下小坑

    1. 数据库中标的命名,mybatis会给你全部转成驼峰命名,这样就会发现找不到数据库的表了.比如下面的,我在本地运行时ok, 表名称是t_blogtype,但是放到服务器就报错说找不到表. 2. 本 ...

  2. 【题解】POJ 3417 Network(倍增求LCA+DP+树上差分)

    POJ3417:http://poj.org/problem?id=3417 思路 我们注意到由“主要边”构成一颗树 “附加边”则是非树边 把一条附加边(x,y)加入树中 会与树上x,y之间构成一个环 ...

  3. Nlog日志出坑合集

    .net core框架下nlog不记录: 1.安装NLog.Web.AspNetCore 2.在Startup.cs文件的方法public void Configure(IApplicationBui ...

  4. vsCode中误删了文件,教你怎么恢复

      不要慌!下面开始帮你找到,很简单!

  5. 洛谷P4383 [八省联考2018]林克卡特树lct(DP凸优化/wqs二分)

    题目描述 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一个叫做“LCT” 的挑 ...

  6. Spring的入门学习笔记 (AOP概念及操作+AspectJ)

    AOP概念 1.aop:面向切面(方面)编程,扩展功能不通过源代码实现 2.采用横向抽取机制,取代了传统的纵向继承重复代码 AOP原理 假设现有 public class User{ //添加用户方法 ...

  7. Ubuntu18.04安装完应该做的一些事 显卡驱动安装和cuda8.0

    博主装Ubuntu18.04主要是为了用于跑深度学习,所以我们先来搞搞gcc环境 第一步:安装多版本gcc.g++可切换 sudo apt-get install gcc-4.8 gcc-4.8-mu ...

  8. 第3章 jQuery中的DOM操作

    parent() .parents().closest() 区别示例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  9. 01-http简介-四层 七层 三次握手

    HTTP简介.请求方法与响应状态码 接下来想系统的回顾一下TCP/IP协议族的相关东西,当然这些东西大部分是在大学的时候学过的,但是那句话,基础的东西还是要不时的回顾回顾的.接下来的几篇博客都是关于T ...

  10. go加密算法:CBC对称加密(一)--DES

    package main import ( "bytes" //"crypto/aes" "crypto/cipher" "cry ...