• 存储过程(过程)


    1.概念:存储过程就是一段存储在数据库中执行某种功能的PL/SQL程序
    跟java中的方法相类似,而且都需要调用
    过程是一个命名的程序块,这种有名字的PL/SQL块称之为存储程序单元或子程序,是被存储到数据库中的。
    其中,子程序分为4种:存储过程、函数、包和触发器
    过程主要的操作是:增删改查
    2.创建存储过程的基本语法:
    create [or replace] procedure [<方案名>.]<存储过程名>
    [ ( <参数1>[ In | Out | In Out ]<数据类型>[,…] ) ]
    Is | As
    [<内部变量1><内部变量的数据类型>[,…] ]
    Begin
    <存储过程体>
    End [<存储过程名>]

    create or replace procedure say is
    begin
        dbms_output.put_line('hello');
    end;
    
    • 1
    • 2
    • 3
    • 4

    3.调用存储过程

    exec 存储过程名();  --第1种
    call 存储过程名();  --第2种
    begin  --第3种
      存储过程名();	
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.输入参数 in、输出参数 out(过程变量前面可以加p_与其他变量进行区分)
    (1) in:表示参数是输入给过程的,在一开始就是要有值的
    带in参数的过程的调用,in在输入的时候可以省略,默认为输入参数
    ①按位置调用
    exec raisesal(7369);
    ②按名称调用
    在调用存储过程的参数列表中不仅提供参数名,还指定给它传递的参数值两部分。
    exec raisesal(eno=>7369)
    可以设置参数的默认值,如果调用时不指定值,则为默认值

    create or replace procedure alen(eno emp.empno%type default 7521)--这样写也可:eno in emp.empno%type:=7521
    is
    p_sal emp.sal%type;--只能写变量类型,不能写精度
    begin
      select sal into p_sal from emp where empno=eno;
      update emp set sal=sal+100 where empno=eno;
      dbms_output.put_line('涨钱前'||p_sal||',涨钱后'||(p_sal+100));--一定要加(),不能省略
    end;
    exec alen(7521);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    (2) out:表示参数在过程中将被赋值,可以传给过程体的外部,相当于变量,一开始是没有值的,是在过程中被赋予的值
    ①如果有输出参数的话,一般要在匿名块中调用,这样更加方便
    在匿名块中把in参数和out参数都设置为变量,然后输出out参数变量

    create or replace procedure show(eno emp.empno%type,p_name out emp.ename%type,p_sal out emp.empno%type)
    is
    begin
      select ename,sal into p_name,p_sal from emp where empno=eno;
      exception
      when no_data_found then
        dbms_output.put_line('无该数据');
    end;
    
    --如果有输出的话,用匿名块输出方便
    declare
      eno emp.empno%type;
      v_name emp.ename%type;
      v_sal  emp.empno%type;
    begin
      show(p_name=>v_name,p_sal=>v_sal,eno=>7521);--按照名字赋值
      --按照位置赋值:show(7521,v_name,v_sal);
      dbms_output.put_line(v_name||' '||v_sal);
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ②在命令窗口通过绑定变量调用
    在这里插入图片描述

    --要在命令窗口中写代码!!
    var v_name varchar2(10); --不能用字段类型%type与%rowtype
    var v_sal number; --number类型不能加长度
    exec show(7369,:v_name,:v_sal); --变量绑定,调用存储过程
    print v_name v_sal;
    select :v_name,:v_sal from dual;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (3)输入输出参数 in out

    --数据交换:输入输出参数
    create or replace procedure swap(n1 in out number,n2 in out number)--in out不可省略
    is
    p_temp number;--变量,常量声明
    begin
      p_temp:=n1;
      n1:=n2;
      n2:=p_temp;
    end;
    
    --匿名块调用存储过程
    declare
      num1 number:=&first;
      num2 number:=&second;
    begin
      dbms_output.put_line('num1='||num1||',num2='||num2);
      swap(num1,num2);
      dbms_output.put_line('num1='||num1||',num2='||num2);
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.查看存储过程

    --user_objects显示有关对象的信息
    select object_name,object_type,status from user_objects where object_name='SHOW';
    
    --user_source显示源代码文本。
    select line,text from user_source where name='SHOW';
    
    
    -- 使用游标 和 loop 循环来显示所有部门的名称
    declare
      cursor myc is select deptno from dept;
      v_dname dept.dname%type;
    begin
      open myc;
      loop
          fetch myc into v_dname;
        exit when myc %notfound;
          dbms_output.put_line(v_dname);
      end loop;
      close myc;
    end;
    
    -- 写一个函数 输入一个员工名字,判断该名字在员工表中是否存在。存在返回 1,不存在返回 0
    create or replace function pd return number
    is
      v_ename emp.ename%type:='&aa';
      n number;
    begin
      select count(*) into n from emp where ename=v_ename;
      if n=0 then return 0;
      else return 1;
      end if;
    end;
    -- 编写一个过程,要求,可以传入部门的编号,部门的名称,之后调用此过程就可以完成部门的增加操作。
    create or replace procedure pdu(dna dept.deptno%type,den dept.dname%type)
    is
    begin
      insert into dept(deptno,dname) values(dna,den);
    end;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    java学习--day11(抽象类、接口)
    1035 Password
    首批 RISC-V 手机要来了,你准备好了吗?
    Day4:面试必考题目
    影视新闻查询易语言代码
    EasyRecovery易恢复苹果Mac电脑计算机数据恢复软件
    【C语言】预处理
    从官方文档中探索 Android App 架构演进的方向
    软件工程(十八) 行为型设计模式(四)
    Android Anr traces.txt 最全最完整说明文档
  • 原文地址:https://blog.csdn.net/begefefsef/article/details/126081126