Oracle数据库—— 存储过程与函数的创建

一、涉及内容

  1.掌握存储过程与函数的概念。

  2.能够熟练创建和调用存储过程与函数。

二、具体操作

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

(1)以scott 用户连接数据库,然后为system 用户授予delete 权限。

语句:

connect scott/tiger;
grant delete on emp to system;

截图:

(2)以system 用户连接数据库,创建存储过程。

语句:

connect system/orcl1234;

create or replace procedure delete_emp
 (id scott.emp.empno%type)
 is
 begin
   delete from scott.emp where empno=id;
 exception
    when others then
      dbms_output.put_line(‘errors‘);
 end;

截图:

(3)system 用户调用delete_emp存储过程。

语句:execute delete_emp(7369);

截图:

(4)scott 用户调用delete_emp存储过程。

语句:

grant execute on delete_emp to scott;
connect scott/tiger;
execute system.delete_emp(7369);

截图:

2.创建存储过程,根据职工编号修改scott.emp表中该职工的其他信息。

(1)   创建新用户,并授予权限。

语句:

connect system/orcl1234;

create user u1
 identified by abcdef;

grant create session,
 create procedure to u1;

grant select,update on scott.emp to u1;

截图:

(2)   以新用户连接数据库,创建存储过程。

语句:

connect u1/abcdef; 

CREATE OR REPLACE PROCEDURE update_emp
 (no IN scott.emp.empno%TYPE,--引用emp表中的某字段的数据类型,必须对该表具有select权限
  name IN scott.emp.ename%TYPE DEFAULT NULL,
  job1 IN scott.emp.job%TYPE DEFAULT NULL,
  mgr1 IN scott.emp.mgr%TYPE DEFAULT NULL,
  hiredate1 scott.emp.hiredate%TYPE DEFAULT NULL,
  salary scott.emp.sal%TYPE DEFAULT NULL,
  comm1 scott.emp.comm%TYPE DEFAULT NULL,
  deptno1 scott.emp.deptno%TYPE DEFAULT NULL
 )
 IS
 BEGIN
   if name is not null then
     update scott.emp set ename=name where empno=no;
   end if;
   if job1 is not null then
     update scott.emp set job=job1 where empno=no;
   end if;
   if mgr1 is not null then
     update scott.emp set mgr=mgr1 where empno=no;
   end if;
   if hiredate1 is not null then
     update scott.emp set hiredate=hiredate1 where empno=no;
   end if;
   if salary is not null then
     update scott.emp set sal=salary where empno=no;
   end if;
   if comm1 is not null then
     update scott.emp set comm=comm1 where empno=no;
   end if;
   if deptno1 is not null then
     update scott.emp set deptno=deptno1 where empno=no;
   end if;
 EXCEPTION
   WHEN others THEN
     rollback;
 END;
 /

截图:

(3)   u1调用update_emp 过程。

语句:   exec update_emp(7369,salary=>2000);

截图:

3.创建存储过程,根据指定的职工编号查询该职工的详细信息。

(1)创建存储过程。

语句:

connect scott/tiger;

  create or replace procedure select_emp
  (no in scott.emp.empno%type,
   emp_information out varchar2)
is
r scott.emp%ROWTYPE;
begin
  select * into r from scott.emp where empno=no;
  emp_information:=emp_information||r.ename||‘  ‘||r.job||‘  ‘||r.sal||‘   ‘||r.mgr||
‘   ‘||r.hiredate||‘   ‘||r.comm||‘   ‘||r.deptno;
exception
  when no_data_found then
     emp_information:=‘No person!‘;
  when others then
     emp_information:=‘Error!‘;
End;
/ 

截图:

(2)调用存储过程。

语句:

set serveroutput on
 declare
   info varchar2(50);
 begin
   select_emp(7369,info);
   dbms_output.put_line(info);
 end;
 /

截图:

4.创建函数,根据给定的部门编号计算该部门所有职工的平均工资。

(1)创建函数。

语句:

create or replace function avg_sal
 (no scott.emp.deptno%type)
 return number
 is
    avgsal number(7,2);
 begin
    select avg(sal) into  avgsal from scott.emp where deptno=no;
    if  avgsal is not null then --因为上面的语句不触发异常,因此用if语句判断是否查询成功
    return  avgsal;
    else
        avgsal:=-1;
        return  avgsal;
    end if;
 end   avg_sal;
 /

截图:

(2)调用函数。

语句:

begin
   dbms_output.put_line(avg_sal(&deptno));
 end;

截图:

(选择题)

  1. 以下哪种程序单元必须返回数据?( A )

  A.函数  B.存储过程  C.触发器  D.包

  2.当建立存储过程时,以下哪个关键字用来定义输出型参数?( C  )

  A.IN    B.PROCEDURE  C.OUT    D.FUNCTION

  3.下列哪个语句可以在SQL*Plus中直接调用一个存储过程?( B )

  A.RETURN   B.EXEC  C.SET    D.IN

  4.下面哪些不是存储过程中参数的有效模式?( D )

  A.IN    B.OUT  C.IN OUT    D.OUT IN

  5.函数头部中的RETURN语句的作用是什么?( A )

  A.声明返回的数据类型

  B.调用函数

  C.调用过程

  D.函数头部不能使用RETURN语句

(编程题)

  1. 根据以下要求编写存储过程:输入部门编号,输出scott.emp 表中该部门所有职工的职工编号、姓名、工作岗位。

(1)授予system用户对scott.emp具有显示的查询权限。

(2)创建存储过程

语句:

create or replace procedure pro_depart
  (no in scott.emp.deptno%type)
  is
    cursor c1 is select * from scott.emp where deptno=no;
  begin
    dbms_output.put_line(‘编号  姓名   工作岗位‘);
    for rec in c1
     loop
       dbms_output.put_line(rec.empno||‘   ‘||rec.ename||‘   ‘||rec.job);
     end loop;
  end;

截图:

(3)执行存储过程

语句:  execute pro_depart(20);

截图:

  2.根据以下要求编写函数:将scott.emp 表中工资低于平均工资的职工工资加上200,并返回修改了工资的总人数。

(1)授予system用户对scott.emp具有修改的权限。

(2)创建函数

语句:

conn system/orcl1234;

create or replace function fun_sal
 return number
 is
   cursor c2 is select * from scott.emp for update;
   rows number default 0;
   avg_sal number(7,2);
 begin
   select avg(sal) into  avg_sal from scott.emp;
 for rec in c2
   loop
    if rec.sal< avg_sal then
     update scott.emp set sal=sal+200 where current of c2;
     rows:=rows+1;
    end if;
   end loop;
 return rows;
 end;

截图:

(3)调用函数

语句:

begin
    dbms_output.put_line(‘修改了工资的总人数是:  ‘||fun_sal);
  end;

截图:

(简答题)

创建与调用存储过程或函数时,应事先授予哪些权限?

答:1.首先创建存储过程自身需要的权限,即应授予create procedure系统权限。

2.用户调用其他用户所创建的存储过程时,应事先授予对该过程的execute权限。

3.如果对某表进行增、删、查、改的操作时,应授予insert、delete、update、select的显示权限。

(补充练习题)

1. 编写函数get_salary,根据emp表中的员工编号,获取他的工资。输入参数为员工编号,如果找到该员工,屏幕显示已找到的信息,函数返回值为该员工的工资。如果找不到,捕获并处理异常,函数返回值为0。函数创建成功后,调用该函数查看效果。

(1)创建函数

语句:

create or replace function get_salary
 (no in scott.emp.empno%type)
  return number
 is
   salary scott.emp.sal%type;
 begin
   select sal into salary from scott.emp where empno=no;
   return salary;
 exception
   when others then
    return 0;
 end;

截图:

(2)调用函数

语句:

begin
    dbms_output.put_line(‘该员工工资是:‘||get_salary(7369));
  end;

截图:

语句:

begin
    dbms_output.put_line(‘该员工工资是:‘||get_salary(2000));
  end;

截图:

2. 编写函数get_cnt,根据输入参数部门编号,输出参数输出该部门的人数,返回值是该部门的工资总和。如果如果找不到,捕获并处理异常,函数返回值为0。函数创建成功后,调用该函数查看效果。

(1)创建函数

语句:

create or replace function get_cnt
 (no in scott.dept.deptno%type,
  cnt out number )
 return number
 is
   salary_sum number(7,2);
 begin
   select sum(sal) into salary_sum from scott.emp where deptno=no;
   select count(*) into cnt from scott.emp where deptno=no;
   return salary_sum;
 exception
   when others then
     return 0;
 end;

截图:

(2)调用函数

语句:

var salary_sum number;
 var cnt number;
 exec :salary_sum:=get_cnt(30,:cnt);

截图:

3.编写存储过程DelEmp,删除emp表中指定员工记录。输入参数为员工编号。如果找到该员工,则删除他的记录,并在屏幕显示该员工被删除。如果没找到,则使用自定义异常处理。存储过程定义成功后,调用该存储过程查看结果。

(1)以scott 用户连接数据库,然后为system 用户授予delete 权限。

语句:

connect scott/tiger;
grant delete on emp to system;

截图:

(2)以system 用户连接数据库,创建存储过程。

语句:

connect system/orcl1234;

create or replace procedure DelEmp
  (no scott.emp.empno%type)
  is
    no_emp exception;
    cnt number;
  begin
    select count(*) into cnt from scott.emp where empno=no;
    if cnt=0 then
       raise no_emp;
    end if;
    delete from scott.emp where empno=no;
    dbms_output.put_line(no||‘号员工已经被删除完毕!‘);
  exception
     when no_emp then
       dbms_output.put_line(‘抱歉!没有找到‘||no||‘号员工!‘);
  end;
 /

截图:

(3)调用存储过程。

语句:exec DelEmp(2000);

截图:

4. 编写存储过程QueryEmp,查询指定员工记录;输入参数为员工编号,输出参数是员工的姓名和工资。如果找到该员工,在屏幕显示该员工已经查到。如果没找到,则捕获异常并处理。存储过程定义成功后,调用该存储过程查看结果。

(1)创建过程

语句:

CREATE OR REPLACE PROCEDURE QueryEmp
  (no IN scott.emp.empno%TYPE,
  name OUT scott.emp.ename%TYPE,
  salary OUT scott.emp.sal%TYPE)
  IS
  BEGIN
     SELECT ename,sal into name,salary FROM scott.emp WHERE empno=no;
     dbms_output.put_line(‘找到员工!‘);
  EXCEPTION
      WHEN NO_DATA_FOUND THEN
            dbms_output.put_line(‘该职工不存在!‘);
  END;
 /

截图:

(2)执行过程

语句:

DECLARE
   emp_name scott.emp.ename%TYPE;
   emp_salary scott.emp.sal%TYPE;
 BEGIN
   QueryEmp(7788,emp_name,emp_salary);  --调用存储过程
   IF emp_name IS NOT NULL THEN --如果该职工存在,则输出
     dbms_output.put_line(‘姓名是:‘||emp_name|| ‘ 工资是:‘||emp_salary);
   END IF;
 END;

亦可:exec QueryEmp(7788,:ename,:sal);

截图:

时间: 2024-10-09 01:17:12

Oracle数据库—— 存储过程与函数的创建的相关文章

JDBC访问Oracle数据库例子源代码,包括创建table,删除table,插入记录,删除记录,查询记录等

package com.cb; public class SMSInfo { public static String ITEMINDEX = "sms_index"; public static String ITEMTO = "sms_to"; public static String ITEMFROM = "sms_from"; public static String ITEMMSG = "sms_msg"; publ

Oracle数据库获取uuid函数

Oracle新建系统表时,要求主键为32位uuid,猜测Oracle肯定会提供相关的函数. 翻阅相关文档,果然发现Oracle提供的函数 sys_guid() 用于获取32位uuid,简单使用为 select sys_guid() from dual; 该函数返回32位的uuid为大写,可以使用 lower(sys_guid()) 转为小写. Oracle数据库获取uuid函数

java下实现调用oracle的存储过程和函数

目录(?)[-] 创建表STOCK_PRICES 插入测试数据 建立一个返回游标 创建和存储过程P_GET_PRICE 创建函数 JAVA调用存储过程返回结果集 开发JAVA调用函数返回结果集 在oracle下创建一个test的账户,然后 1.创建表:STOCK_PRICES [cpp] view plaincopy --创建表格 CREATE TABLE STOCK_PRICES( RIC VARCHAR(6) PRIMARY KEY, PRICE NUMBER(7,2), UPDATED D

Oracle数据库——用户、方案的创建与管理

一.涉及内容 1.掌握用户.方案与权限的基本概念. 2.熟练掌握用户操作的相关命令. 二.具体操作 (一)选择题: 1.关于方案的描述下列哪一项不正确?(C) A.表或索引等对象一定属于某一个方案 B.在oracle 数据库中,方案与数据库用户是一一对应 C.一个表可以属于多个方案 D.一个方案可以拥有多个表 2.下列哪个对象属于方案对象?(C ) A.数据段  B.盘区  C.表 D.表空间 3.以下哪个命令用来连接Oracle 数据库?(B ) A.CREATE B.CONNECT C.AL

学习之痛(数据库-&gt;存储过程和函数)

存储过程和函数作为数据库的一部分,为什么是学习之痛. 项目实际开发,考虑性能和代码维护,绝对不用存储过程. 如果单纯自己写个小程序糊弄人玩,还可以写写. [学习] 在数据库中定义一些SQL语句集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.避免开发人员重复编写相同的SQL语句.在MySql服务器中存储和执行,可以减少客户端和服务端的数据传输. delimiter && create procedure pro_book(in bT int,out count_num in

编程开发之--Oracle数据库--存储过程和存储函数(1)

1.存储过程和存储函数 描述:指存储在数据库中供所有用户程序调用的子程序叫做存储过程.存储函数 区别:存储函数可以通过return子句返回一个函数的值 (1)存储过程 语法:create [or replace] PROCEDURE 过程名(参数列表) AS PLSQL子程序体; 存储过程的调用方式: a)exec/execute 过程名(); b)begin 过程名(); 过程名(); end; / 带参数的存储过程: 举例:为指定的员工涨100块钱工资,并且打印涨前以及涨后的工资. 在sql

oracle的存储过程和函数(PL/SQL)

czmmiao 存储过程概述 存储过程是子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库.是一个有名字的PL/SQL代码块,支持接收或不接受参数,同时也支持参数输出.一个存储过程通常包含定义部分,执行部分,Exception部分,可以被其他子程序调用,也可以被重用.过程定义CREATE [OR REPLACE]PROCEDURE procedure_name[(argument_name [IN | OUT | IN OUT] argument_type)]AS | ISBE

Oracle数据库常用SQL函数

1.SQL函数的概念: 函数一般是在数据上执行的,它给数据的转换和处理提供了方便.只是将取出的数据进行处理,不会改变数据库中的值.(类似于java中的方法但函数只是将数据库中的数据取出(复制)到函数中进行运算,并不会修改数据库中的数据) 2.Sql函数可以分为组函数和单行函数. –单行函数对单个数值进行操作,并返回一个值–组函数又被称作聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或查询的having子句 3.单行函数的分类: 单行函数分为字符函数.数字函数.日期

oracle数据库报表汇总函数grouping

前两天同事问一个oracle使用grouping完成一个统计报表的功能,这个函数帅呆了.开发分组报表直接一个SQL就搞定. grouping(columnA)函数的意思:当前行如果是由rollup汇总产生的,那么columnA这个字段值为1否则为0 元数据: 通过grouping查询后的数据: sql: select decode(grouping(f_line)+grouping(f_workarea),1,'小计',2,'总计',f_workarea) f_workarea, decode(