----------------------------------------------创建存储过程(无返回值)----------------------------------------------------
/*
语法:
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;
Oracle开发子程序和包
猜你喜欢
转载自blog.csdn.net/javaasd/article/details/105736848
今日推荐
周排行