Oracle存储过程、函数、包的使用

Oracle存储过程、函数、包的使用注意:存储过程是没用返回值的。 注意: 先进行按位置,再按名称,并且一旦开始按照名称传递就不能再使用按位置传递。 函数定义时必须有返回对应参数类型,存储过程则没用要求。 函数执行操作后必须有返回变量值,存储过程则没用要求。

Oracle存储过程

1、创建存储过程(无参数)

-- 创建存储过程
create or replace procedure proc_emp as
       cursor cur_cus is select * from emp where deptno = 10;
begin
  for v_row in cur_cus loop
    dbms_output.put_line(v_row.empno||' | '||v_row.ename);
    end loop;
end proc_emp;

PLSQL执行存储过程

-- 先在Command Window窗口打开显示输出
set serveroutput on;
-- 再执行存储过程
exec proc_emp;

JDBC调用执行存储过程(在PLSQL中执行此命令,将查询到的结果存到缓存中,当再次调用 exec proc_emp时,将缓存中存到的所有数据展示出来,总共有两次记录)

当过程无参时,也需要小括号

call proc_emp();

2、创建存储过程(带参数)

注意:形参不能写精度,否则编译错误

create or replace procedure proc_emp(dno number) as
       cursor cur_cus is select * from emp where deptno = dno;
begin
  for v_row in cur_cus loop
    dbms_output.put_line(v_row.empno||' | '||v_row.ename);
    end loop;
end proc_emp;

PLSQL执行存储过程

exec proc_emp(30);

jdbc执行存储过程

call proc_emp(30);

使用PLSQL存储过程对话框建立存储过程生成标准的sql语句

创建多个参数的存储过程

create or replace procedure proc_emp(dno number,dname varchar2) as
begin
  insert into dept values(dno,dname);
  -- DDL语句不会自动提交事务,必须手动提交事务
  commit;
end proc_emp;

注意:存储过程是没用返回值的。

3、形参的分类:

  • 1- 输入类型参数: 参数名 IN 参数类型; (默认的参数类型)
  • 2- 输出类型参数: 参数名 OUT 参数类型;
  • 3- 输入输出类型参数: 参数名 IN OUT 参数类型;

定义带输出类型参数的过程

create or replace procedure proc_get_sal(eno number, esal out number) is
begin
  select sal into esal from emp where empno = eno;
end proc_get_sal;

— 执行带输出类型参数的过程

  • 1- 定义一个变量

    SQL> var v_sal number;
    
    • 2- 使用变量承载输出类型参数的信息; 注意:变量的使用格式: :变量名

      SQL> exec proc_get_sal(7788, :v_sal);
      -- call方式调用
      SQL> call proc_get_sal(7839,:v_sal);
      
      • 3- 打印输出变量

        print v_sal;
        

定义输入输出类型参数的过程

create or replace procedure proc_get_sal(v_val in out number) is
begin
  select sal into v_val from emp where empno = v_val;
end proc_get_sal;
  • 调用带输入输出类型参数

    -- 1- 定义变量
    var v_val number;
    -- 2- 赋予输入的值
    begin 
       :v_val:=7839; 
    end;
    -- 3- 执行
    exec proc_get_sal(:v_val);
    -- 再次查看结果
    print v_val;
    

4、实参的传值方式

  • 1- 按位置传值

    * SQL> exec proc_add_dept('dev', 50, 'lintong');
    
    • 2- 按照名称传值
    SQL> exec proc_add_dept(p_loc => 'lintong',p_dname => 'dev',p_dno => 50);
    
  • 3- 混合传递

    SQL> exec proc_add_dept('dev2',p_loc => 'lintong',p_dno => 70);
    

注意: 先进行按位置,再按名称,并且一旦开始按照名称传递就不能再使用按位置传递。

错误的示范:

SQL> exec proc_add_dept('dev3',p_dno => 80,'changan');

使用参数类型的规范:

  • 1- 形参尽量不要使用 out 或者 in out 类型参数
  • 2- 使用按照位置传递实参,不要使用按名称和混合传递;

存储函数

存储过程和存储函数的两个区别:

  • 函数定义时必须有返回对应参数类型,存储过程则没用要求。
  • 函数执行操作后必须有返回变量值,存储过程则没用要求。

创建存储函数

create or replace function fun_get_sal(eno number) return number
is
  v_result number;     
begin
  select sal into v_result from emp where empno=eno;
  return v_result;
end;

执行函数的三种方式

  • 1、定义变量将函数返回值赋值给变量

    -- 1-定义接收函数返回值的变量
    SQL> variable v_sal number;
    -- 2-调用函数将返回值传递给变量
    SQL> exec :v_sal := fun_get_sal(7566);
    
  • 2、直接输出的方式调用函数(记得输出语句在语句块中)

SQL> begin 
          dbms_output.put_line(fun_get_sal(7566));
     end;
     /
  • 3、在SQL中调用

    查询工资占本部门总工资的百分比

    一、先创建函数

    注意:形参和返回类型不能带精度,定义的其他变量可以带精度

    create or replace function fun_get_dept_sal(esal number, dno number) return varchar2 is
      FunctionResult varchar2(7);
      
    begin
       select round(esal / (select sum(sal) from emp where deptno=dno)*100,2)||'%' into FunctionResult from dual;
      return(FunctionResult);
    end fun_get_dept_sal;
    

    二、调用函数返回结果

    select e.*,fun_get_dept_sal(e.sal,e.deptno) per_sal
    from emp e;
    

    PL/SQL包

    包就是一个PL/SQL的相关对象的逻辑分组和单个对象存储在数据库中的存储程序单元

    相关的PL/SQL对象可以是常量、变量、游标、异常、过程和函数

    包的组成:

    1、包规范部分(也成为包的声明部分)

    2、包主体部分

    包的定义,分为声明(定义)部分(packages文件夹下)

    注意:包分为声明部分和主体部分,声明部分全为public,外部能直接访问的,主体部分为私有部分,外部不能直接访问,声明部分和私有部分的名称要一致,当主体部分调用声明部分的公有方法时,公有函数内部调用主体部分的私有函数时,私有部分必须在公有方法的前面,才能调用,是面向过程调用,顺序执行

    create or replace package pak_emp is
    
      -- Public variable declarations
      fie_dno number;
      fie_sal number;
    
      -- Public function and procedure declarations
      function get_sal(eno number) return number;
    
      procedure print_sal(eno number);
    
    end pak_emp;
    

    主体(实现)部分(package bodies文件夹下)

    create or replace package body pak_emp is
    
      -- Private variable declarations
      fie_ename emp.ename%type;
    
      -- Function and procedure implementations
       function get_sal(eno number) return number is
         begin
           select sal into fie_sal from emp where empno = eno;
           return fie_sal;
         end get_sal;
    
      -- private function or procedure
      procedure print_private_sal(eno number) is
        begin
          dbms_output.put_line(get_sal(eno));
        end print_private_sal;
    
      -- public procedure
      procedure print_sal(eno number) is
        begin
          print_private_sal(eno);
        end print_sal;
        
    end pak_emp;
    

调用包中的函数或者过程、属性等

注意:只能调用声明部分的公有属性、函数、过程等,不能调用主体部分的私有数据

调用过程: 使用包名.过程名调用

exec pak_emp.print_sal(7566);

对主体部分属性进行赋值调用并输出

注意: 对变量进行赋值操作使用 := 在语句块中执行完必须写/

begin pak_field.field1 := 10;pak_field.field2 := 'abc'; 
dbms_output.put_line(pak_field.field1||' | '||pak_field.field2);
end;
/

当更改了主体部分和声明部分的sql时,就要在packages和package bodies文件夹下分别右键点击recompare重新编译

声明部分有的属性或者函数,主体部分必须实现,否则主体部分自定义的私有函数,外部无法调用,允许函数或者过程只在声明部分声明,不去主体部分实现也是可以的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/37170.html

(0)

相关推荐

  • sql中聚合函数的用法_MySQL聚合函数

    sql中聚合函数的用法_MySQL聚合函数聚集函数:SQL基本函数,聚集函数对一组值执行计算,并返回单个值,也被称为组函数。聚集函数经常与SELECT语句的GROUP BY子句的HAVING一同使用。但是不可用于WHERE语句中,因为WHER

    2023-04-19
    149
  • JuiceFS v0.17 发布,通过 1270 项 LTP 测试!

    JuiceFS v0.17 发布,通过 1270 项 LTP 测试!小伙伴们大家好,JuiceFS v0.17 在国庆小长假来临之际如期发布了!这是我们在 2021 年秋季推出的第二个版本,让我们直奔主题,看看都有哪些新变化吧。 本次更新累计 80+ 提交,共有 9

    2023-04-23
    150
  • Python是一门优秀的编程语言

    Python是一门优秀的编程语言Python是一门高级编程语言,由荷兰程序员Guido van Rossum于1989年默默开发。 Python于1994年被发布,受到了程序员们的热烈欢迎。Python一直处于稳定发展状态,并在不断扩展应用领域。现在,Python已经被广泛应用于Web开发、数据分析、人工智能、机器学习等多个领域。Python语言特点是简单、易学、易读、易维护,拥有丰富的标准库和第三方库。

    2024-06-24
    38
  • 子查询优化之 Semi-join 优化 | StoneDB 研发分享 #2[亲测有效]

    子查询优化之 Semi-join 优化 | StoneDB 研发分享 #2[亲测有效]缘起 StoneDB 在列式存储引擎 Tianmu 的加持下,在大多数场景下相对 MySQL 都会有大幅性能提升。当然,这是需要工程师不断优化代码才能做到的,而且,性能好也需要通过基准测试才有说服力,

    2023-06-18
    141
  • Python安装tar.gz教程

    Python安装tar.gz教程对于一些在Linux系统下进行Python开发的人来说,安装Python tar.gz是一个非常常见的任务。Python tar.gz是源代码压缩包,通常有一些优点,比如自由度更高、安装更灵活、可以自己手动编译。在这篇文章中,我将提供一些简单且易于跟随的步骤,以便让读者可以轻松地完成Python tar.gz的安装。

    2024-06-28
    58
  • mysql表锁与行锁_数据库行锁和表锁

    mysql表锁与行锁_数据库行锁和表锁行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑。遇到了可别乱踩。通过本章内容,带你学习MySQL的行锁,表锁,两种锁的优缺点,行锁变表锁的原因,以及开发中需要注意的事项。还在等啥?经验等你来拿!

    2023-04-02
    149
  • 开关电源的故事-起源-电感毛刺[亲测有效]

    开关电源的故事-起源-电感毛刺[亲测有效]毛刺现象是我们每一个电子爱好者避之唯恐不及的,今天我们来学习一个毛刺现象以及如何规避它,进而掌握电感升压的原理。 简单场管开关电路 让我们从一个简单的电路开始,该电路使用一个 N 沟道场效应管控制 2

    2023-07-25
    129
  • 使用Python计算余弦相似度

    使用Python计算余弦相似度在自然语言处理中,衡量两个文本的相似度常常使用余弦相似度。余弦相似度基于向量空间模型,将文本看作向量,利用两个向量之间的夹角余弦值作为它们的相似度。在一定程度上,它可以定量地反映两个文本在内容上的相似性。

    2024-01-23
    96

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注