Oracle开发子程序和包


----------------------------------------------创建存储过程(无返回值)----------------------------------------------------

/*
    语法:
    create or replace procedure 过程名称(变量名1(in 入参,out出参,inout 出入参) 数据类型,变量名2 数据类型)
    is/as
*/

--1.创建一个无参过程,输出7499的部门编号

create or replace procedure getdeptno1  --or replace可以不加,不加不能修改,加上or replace 可以
is --is或as都可以
 v_deptno emp.deptno%type;
 begin
   select deptno into v_deptno from emp where empno=7499;
   dbms_output.put_line(v_deptno);
 end;


--调用
  --1.
  begin
  getdeptno1;
  end;
  --2
  call getdeptno1();
  --3 getdeptno1 test测试
  --4
  exec getdeptno1;--只能用户黑窗口

--2.创建一个入参的过程 根据输入的员工编号输出员工的部门编号 (接收参数)
create or replace procedure getdeptno2(v_empno in number)
is
v_deptno emp.deptno%type;
begin
  select deptno into v_deptno from emp where empno=v_empno;
  dbms_output.put_line(v_deptno);
end;

--调用
--1.
begin
  getdeptno2(7499);
end;

--2.
declare
  v_empno emp.empno%type:=&e;
begin
  getdeptno2(v_empno);
end;


--3.创建一个带有出参的过程 根据输入的员工的编号 返回员工部门编号 
create or replace procedure getdeptno3(v_empno in number,v_deptno out number)
is
begin
  select deptno into v_deptno from emp where empno=v_empno;
end;

--调用
declare
  v_empno number(10):=&e;
  v_deptno1 number(10);
begin
  getdeptno3(v_empno,v_deptno1);
  dbms_output.put_line(v_deptno1);
end;

--4 创建一个出入参的过程 根据输入的员工的编号 返回员工部门编号
create or replace procedure getdeptno4(v_param in out number)
is
begin
  select deptno into v_param from emp where empno=v_param;
end;

--调用
declare
  v_param number(10):=&e;
begin
  getdeptno4(v_param);
  dbms_output.put_line(v_param);
end;


--参数的传递方式

--新增一个部门
create or replace procedure insertdept(v_deptno number,v_dname varchar2,v_loc varchar2)
is
begin
  insert into dept values(v_deptno,v_dname,v_loc);
end;


select *from dept
--1.按位置传参
declare
  pt number(10):=44;
  namee varchar2(100):='l';
  locc varchar2(100):='dd';
begin
  insertdept(pt,namee,locc);
end;

--2.按名字传参
declare
  pt number(10):=44;
  namee varchar2(100):='l';
  locc varchar2(100):='d';
begin
  insertdept(v_deptno=>pt,v_dname=>namee,v_loc=>locc);
end;
--3.混合
declare
  pt number(10):=44;
  namee varchar2(100):='l';
  locc varchar2(100):='d';
begin
  insertdept(pt,v_dname=>namee,v_loc=>locc);
end;


-----------------------------------------------函数(有返回值)-------------------------------------------------------------

/*
   create or replace function 函数名(参数【in/out】数据类型,。。。)
   return 返回值类型
   is/as
   声明变量/声明常量
*/

--创建一个无参有返回值的函数  获取一个随机数并求整
create or replace function getRound return number
is
  v_no number(10);
begin
  v_no:=ceil(dbms_random.value()*100);
  return v_no;
end;


--调用
--1.
select getround from dual

--2.在代码块中调用
declare
  v_return number(10);
begin
  v_return:=getround();
  dbms_output.put_line(v_return);
end;

--带入参有返回值的函数  通过输入员工编号获得员工所在的部门名称
create or replace function fun_deptno(v_empno number)return varchar2
is
  v_dname dept.dname%type;
begin
  select dname into v_dname from emp,dept where emp.deptno=dept.deptno and empno=v_empno;
  return v_dname;
end;

--调用
select fun_deptno(empno) from emp

declare
  v_dname varchar2(200);
  v_empno number(10):=&e;
begin
  v_dname:=fun_deptno(v_empno);
  dbms_output.put_line(v_dname);
end;

--入参出参还带返回值的函数 通过输入员工编号获得员工所在的部门名称和部门地址
create or replace function fun_deptno2(v_empno number,v_loc out varchar2)return varchar2
is
  v_dname dept.dname%type;
begin
  select dname,loc into v_dname,v_loc from emp,dept where emp.deptno=dept.deptno and
  empno=v_empno;
  return v_dname;
end;

--调用
declare
  v_dname varchar2(200);
  v_empno number(10):=&e;
  v_loc varchar(200);
begin
  v_dname:=fun_deptno2(v_empno,v_loc);
  dbms_output.put_line(v_dname);
  dbms_output.put_line(v_loc);
end;


------------------------------------------------包---------------------------------------------------------------

--创建包

 --语法
  /* 
     create or replace package 包名
     is/as
     
     声明的内容
     
     end 包名;
  */
--创建包和包体


-- 调整部门30的员工工资为最高  写一个存储过程调整薪资,写一个函数获取最高工资
--首先创建包规范
create or replace package changeSal
is
  --这是一个共有变量 
  v_deptno number(10):=30;
  --共有的存储过程
  procedure proc_changeSal(v_max number);
  --共有的函数
  function func_getMax return number;
end changeSal;

----------------------------------------------------------------------

--创建一个包头
create or replace package pag_dept
as
function fun_query_dept return varchar2;
procedure pro_query_dept;
procedure pro_insert_dept(v_deptno dept.deptno%type,v_dname dept.dname%type,v_loc dept.loc%type);
end pag_dept;

--创建包体
create or replace package body pag_dept
as
--过程
procedure pro_query_dept
  is t_dname1 dept.dname%type;
  begin
    select dname into t_dname1 from dept where deptno=10;
    dbms_output.put_line('部门名称'||t_dname1);
    exception
      when no_data_found then
       dbms_output.put_line('没有找到数据');
end;
       
       --添加部门过程
       procedure pro_insert_dept(v_deptno dept.deptno%type,v_dname dept.dname%type,v_loc dept.loc%type)
       is
       begin
         insert into dept values(v_deptno,v_dname,v_loc);
         end;
         --函数
         function fun_query_dept
           return varchar2
           as
           t_dname dept.dname%type;
           begin
             select dname into t_dname from dept where deptno=10;
             return t_dname;
             end;
             end pag_dept;
             
             --包的调用
             declare
             v_dname dept.dname%type;
             begin
               v_dname:=pag_dept.fun_query_dept;--调用函数
               dbms_output.put_line('通过函数查询出来的部门名称:'||v_dname);
               pag_dept.pro_insert_dept(5,'cc','bbb');
             end; 
               
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值