当前位置: 首页 > news >正文

Oracle基础学习(二) 存储过程和函数

--创建函数语法
create [or replace] function [schema.]function_name
(函数参数列表) --参数有IN、OUT、IN OUT三种类型;IN代表需要输入的参数,OUT代表要返回的参数,IN OUT代表即是输入参数也是返回参数。
return datetype--返回类型               
-- out参数:查询某个员工姓名、月薪和职位 -- 原则: 如果只有一个返回值,用存储函数;否则,就用存储过程。
[is | as ]---任选一个,后面跟pLSQL代码块 [declare]--有参数时使用关键字 begin --执行的SQL end; --实例

1.

根据输入参数的部门内码获得部门名称

CREATE OR REPLACE FUNCTION f_get_name(i_empno IN VARCHAR2)
RETURN VARCHAR2 IS
v_emp_name emp.ename%TYPE;
BEGIN
SELECT t.ename INTO v_emp_name
FROM emp t WHERE t.empno = i_empno;
RETURN(v_emp_name);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('你需要的数据不存在');
WHEN OTHERS THEN
dbms_output.put_line('发生其他错误');
END f_get_name;

2.
create
or replace function avg_pric(v_total in number(10.2), v_num In OUT number(10,2)) return number(10,2) as v_pric number(10,2); begin v_pric:=v_total/v_num; return v_pric; end; --查看函数 select * from User_Procedures;--用户拥有的触发器、存储过程、函数查询表 select * from User_Source;--查询用户拥有触发器、存储过程、函数的源码。 select * from dba_Procedures;--系统表 select * from dba_Source;--系统表

3.--查询某个员工的年收入
create or replace function queryemp_income(eno in number)
return number
as 
    --定义变量接收薪水和奖金
    p_sal emp.sal%type;
    p_comm emp.comm%type;
begin
  select sal,comm into p_sal,p_comm from emp where empno=eno;
  --nvl为遇空函数,如果p_comm为空则返回0
  return nvl(p_comm,0)+p_sal*12;
end;
 
  

 存储过程

CREATE [OR REPLACE] PROCEDURE procedure_name
    [ (parameter [,parameter]) ]
IS
    [declaration_section]
BEGIN
    executable_section
[EXCEPTION
    exception_section]
END [procedure_name];
复制代码

调用存储过程方式一,exec 存储过程名

调用存储过程方式二,PLSQL程序

1.无参数存储过程
create or replace procedure pro_no_par is begin update employees set salary=salary+100 where employee_id=100; commit; dbms_output.put_line('工资已经调整!!'); end pro_no_par; --执行,使用execute execute pro_no_par;

2.in传入参数存储过程

create or replace procedure pro_no_par
is

  begin
  update employees set salary=salary+100 where employee_id=100;
  commit;
  dbms_output.put_line('工资已经调整!!');
  end pro_no_par;
  --执行,使用execute
  execute pro_no_par;

 3. out参数 

  declare
  ex_var_1 number;
  ex_var_2 employees.first_name%type;
  ex_var_3 employees.phone_number%type;
  begin
   ex_var_1:=102;
  pro_out_par(ex_var_1,ex_var_2,ex_var_3);
  dbms_output.put_line('员工号为'||ex_var_1||'的员工姓名是;'||ex_var_2||',联系电话是:'||ex_var_3);
  end;

其中参数IN表示输入参数,是参数的默认模式。

OUT表示返回值参数,类型可以使用任意Oracle中的合法类型

  

-- out参数:查询某个员工姓名、月薪和职位
-- 原则: 如果只有一个返回值,用存储函数;否则,就用存储过程。
create or replace procedure queryempinfor(eno in number,pename out varchar2,
  psal out number,pjob out varchar2)
as 
begin
   -- 得到该员工的姓名、月薪和职位
    select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;
/
--将人员表中经理职位并且年薪大于7万的人员信息插入到MANAGER表中,输出参数是插入的条数

create or replace procedure p_manager_update(o_ename_num out number) is
begin
select to_number(count(1)) into o_ename_num
from emp e
where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000
and e.job='MANAGER';
insert into MANAGER(INCODE,ENAME,CREATE_DATE)
select deptno_seq.nextval,e.ename,sysdate
from emp e
where nvl(e.sal,0)*12+nvl(e.comm,0) > 70000
and e.job='MANAGER'; 
commit;
end p_manager_update;

--在COMMONAD WINDOWS里执行

exec p_manager_update;
 

 

--显示cursor的处理
declare 
---声明cursor,创建和命名一个sql工作区
cursor cursor_name is 
     select real_name from account_hcz;
     v_realname varchar2(20);
begin
     open cursor_name; ---打开cursor,执行sql语句产生的结果集
     fetch cursor_name into v_realname; --提取cursor,提取结果集中的记录
     dbms_output.put_line(v_realname);
     close cursor_name; --关闭cursor
end ;

 

 

 

转载于:https://www.cnblogs.com/jeffjoy/p/9209189.html

相关文章:

  • (四)Linux Shell编程——输入输出重定向
  • RHEL6解决无法使用YUM源问题 {已验证切实可行}
  • .NET Core 中的路径问题
  • 太多脚本将会毁掉持续交付
  • java中的equals和==
  • Fcoin交易所的危险游戏!韭菜请远离!
  • mavne settings.xml
  • Ambari 2.6(HDP 2.6.5)安装记要
  • IP 地址 与 DNS
  • iOS 开发知识索引
  • 多线程多进程学习threading,锁,线程间数据状态读取。
  • Lombok使用详解(转)
  • 【JS基础】--位置距离小结
  • Java中泛型ClassT、T与Class?
  • 查询优化器
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • CentOS 7 修改主机名
  • co模块的前端实现
  • CSS 提示工具(Tooltip)
  • Hibernate【inverse和cascade属性】知识要点
  • Java面向对象及其三大特征
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Mysql数据库的条件查询语句
  • PAT A1092
  • Python十分钟制作属于你自己的个性logo
  • rc-form之最单纯情况
  • session共享问题解决方案
  • 构建工具 - 收藏集 - 掘金
  • 基于 Babel 的 npm 包最小化设置
  • 如何进阶一名有竞争力的程序员?
  • 数组大概知多少
  • 思否第一天
  • Linux权限管理(week1_day5)--技术流ken
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #DBA杂记1
  • #define与typedef区别
  • #pragma data_seg 共享数据区(转)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十) 初识 Docker file
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转)我也是一只IT小小鸟
  • .NET NPOI导出Excel详解
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET4.0并行计算技术基础(1)
  • .NetCore部署微服务(二)
  • .Net接口调试与案例
  • /run/containerd/containerd.sock connect: connection refused
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [20170705]diff比较执行结果的内容.txt