Oracle 笔记(四)
PLSQL编程【语法、plsql控制语句、异常、游标、触发器、存储过程】
1、 PLSQL的语法–块编程
a) 概念:procedural language struct query language
b) PLSQL书写语法
declare
--声明块
begin
--执行块
exception—异常块
when XXX异常 then—捕获异常的语法
--异常处理
end;
c) 变量的定义
变量名[constant]数据类型 := 初始值;
d) 数据类型
Oracle数据类型:integer,number ,varchar2,char……
|
--声明一个变量,在变量中存储一个姓名“王健”,并打印“欢迎王健同学来上课” declare v_name varchar2(10); begin v_name :='王健'; dbms_output.put_line('欢迎'||v_name||'同学来上课!'); end; |
|
会话输出打印开关 set serveroutput on; |
|
--声明一个变量,在变量中存储一个姓名“王健”,并打印“欢迎王健同学来上课” declare v_name varchar2(10):='王健' ; v_age number(3):=18; begin --给变量v_name赋值 v_name := '&学生姓名'; v_age := &年龄; dbms_output.put_line('欢迎'||v_name||v_age||'同学来上课!'); end; |
e) 伪类型
1) 列伪类型emp.ename%type
2) 行伪类型emp%rowtype
|
--编写一段plsql块,完成功能把scott用户的姓名存储到v_ename变量中,工资存储到v_sal变量中并打印变量存储的值 declare v_ename emp.ename%type; --列伪类型 v_sal emp.sal%type; begin select ename,sal into v_ename,v_sal from emp where ename='SCOTT'; dbms_output.put('员工的姓名:'||v_ename); dbms_output.put_line(',员工的工资:'||v_sal); end; |
|
--编写一段plsql块,完成功能把scott用户的所有信息存储并打印出来 declare v_emprow emp%rowtype;--行伪类型 begin select*into v_emprow from emp where ename ='SCOTT'; dbms_output.put_line(v_emprow.empno||v_emprow.ename||v_emprow.job); end; |
f) 变量赋值有几种方式?
1.:=[初始化、语句赋值]
2.select 字段名 into 变量名 from 表
3.替代变量&变量描述
2、 PLSQL编程控制语句语法–编程思想
a) if条件分支
if 条件 then
--操作语句
elsif条件 then
--操作语句
else
--操作语句
end if;
b) case多分支
case 比较变量
when 比较值 then
--操作语句
when 比较值 then
--操作语句
when 比较值 then
--操作语句
when 比较值 then
--操作语句
……
else
--缺省值
end case;
c) 循环之while循环
While 循环条件
Loop
--执行语句
end loop;
d) 循环之dowhile循环 loop循环
loop
--执行语句
Exit when 退出条件
end loop;
e) 循环之for循环
For 循环变量 in 开始值..结束值
Loop
end loop;
f) Goto :问题-多重循环跳出问题【循环不能超过三层,垃圾代码】
|
一、 条件分支语句 a) 简单的条件判断 if- then --编写一个块,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10% declare v_ename emp.ename%type; v_sal emp.sal%type; begin v_ename :='&雇员姓名'; select sal into v_sal from emp_bak where ename=v_ename; if v_sal<2000then update emp_bak set sal= sal*1.1where ename=v_ename; endif; end; |
|
a) 二重条件分支 if then else --编写一个块,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100;如果补助为0就把补助设为200 --编写一个块,可以输入一个雇员名,如果该雇员的补助不是0就在原来的基础上增加100; --如果补助为0就把补助设为200 declare v_ename emp.ename%type; v_comm emp.comm%type; declare v_ename emp.ename%type; v_comm emp.comm%type; begin v_ename :='ALLEN'; select nvl(comm,0)into v_comm from emp_bak where ename=v_ename; if v_comm<>0then update emp_bak set comm = comm+100where ename = v_ename; else update emp_bak set comm =200where ename = v_ename; endif; end; |
|
b) 多重条件分支 if-then elsif – else[CASE 实现] --编写一个块,可以输入一个雇员编号,如果该雇员的职位是PRESIDENT就给他的工资增加1000,如果该雇员的职位是MANAGER就给他的工资增加500,其它职位的雇员工资增加200 |
|
二、 循环语句– loop 编写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从1开始 --编写一个过程,可输入用户名,并循环添加10个用户到users表中,用户编号从1开始
|
3、 异常【系统异常、通用异常、自定义异常、应用程序异常】
a) 系统异常
|
--使用替代变量输入数据,实现向emp表插入数据,并在插入前检查是不是违反主键约束, declare v_empno emp.empno%type; v_ename emp.ename%type; v_sal emp.sal%type; begin v_empno :=&empno; v_ename :='&ename'; v_sal :=&sal; insertinto emp_bak(empno,ename,sal)values(v_empno,v_ename,v_sal); exception when Dup_val_on_index then dbms_output.put_line('员工编号已经存在!'); end; |
b) 通用异常【others】SQLCode异常编码 sqlerrm异常错误消息
|
--查询?部门的所有员工打印结果 declare v_emprow emp%rowtype; v_deptno emp.deptno%type; begin v_deptno :=&deptno; select*into v_emprow from emp where deptno = v_deptno; exception /* when No_data_found then dbms_output.put_line('输入的部门不存在!'); when Too_many_rows then dbms_output.put_line('返回的行数太多!'); */ whenothersthen dbms_output.put_line('错误编号:'||SQLCode||',错误信息:'||SQLErrM); end; |
c) 自定义异常
|
--编写PLSQL块,完成限制输入的数字范围1到10,并正确处理异常 declare v_num number(2); --1、定义一个异常 MY_ERR exception; begin v_num :=0; --2、经过判断后抛出异常. if v_num <1or v_num >10then raise MY_ERR; endif; dbms_output.put_line(v_num); --3、捕获异常 exception when MY_ERR then dbms_output.put_line('输入的数字必须在1~10之间'); end; |
d) 应用程序异常反馈
pragma exception_init(异常名称,sqlcode);
raise_application_error(sqlcode,sqlerrm) sqlcode错误编码-20000 ~ -20999
|
declare v_num number(2); --1、定义一个异常 MY_ERR exception; pragmaexception_init(MY_ERR,-20001); begin v_num :=0; --2、经过判断后抛出异常. if v_num <1or v_num >10then raise_application_error(-20001,'输入的数字必须在1~10之间'); endif; dbms_output.put_line(v_num); --3、捕获异常 exception whenothersthen dbms_output.put_line('错误编号:'||SQLCode||',错误信息:'||SQLErrM); end; |
4、 游标cursor-处理多行数据
a) 隐式游标sql
b) 显式游标
c) 动态游标(REF游标)
d) 公有属性
%found 影响一行或多行数据的时候此属性为true
%notfound 没有影响行数此属性为true
%rowcount 行数
%isopen 游标的打开
e) 案例一:隐式游标-修改scott的工资为2000块
|
--隐式游标-查询SCOTT的工资并进行打印 declare v_sal emp.sal%type; begin select sal into v_sal from emp where ename ='SCOTT'; ifsql%foundthen dbms_output.put_line(sql%rowcount); endif; end; --隐式游标-修改30号部门的工资为2000块 Begin update emp_bak set sal =2000where deptno =30; ifsql%foundthen dbms_output.put_line(sql%rowcount); else dbms_output.put_line(‘输入的部门编号不存在!’); endif; end; |
f) 案例二:显式游标-查询30号所有员工信息
|
--查询30部门所有员工信息 declare v_emprow emp%rowtype; --定义游标 cursor cur_erow isselect*from emp where deptno =30; begin --获取游标 for v_emprow in cur_erow loop dbms_output.put_line('雇员姓名:'||v_emprow.ename); endloop; end; |
案例三:带参显式游标 -显式游标-查询?号所有员工信息
|
--查询30部门所有员工信息 declare v_emprow emp%rowtype; --定义游标 cursor cur_erow(v_deptno emp.deptno%type)isselect*from emp where deptno = v_deptno; begin --获取游标 for v_emprow in cur_erow(&deptno) loop dbms_output.put_line('雇员姓名:'||v_emprow.ename); endloop; end; |
练习:将score_bak表中的每个学生的成绩改成这门课的平均成绩
|
declare v_vwrow vw_avg_scr%rowtype; cursor cur_avg isselect*from vw_avg_scr; begin for v_vwrow in cur_avg loop update score_bak set scr = v_vwrow.avg_scr where cno = v_vwrow.cno; endloop; end; |
g) 案例四:loop循环游标
|
--查询30号部门所有员工信息 declare v_erow emp%rowtype; --定义游标 cursor cur_erow isselect*from emp where deptno =30; begin --打开游标 open cur_erow; --获取游标 loop fetch cur_erow into v_erow; dbms_output.put_line('员工姓名:'||v_erow.ename); exitwhen cur_erow%notfound; endloop; --关闭游标 if cur_erow%isopenthen close cur_erow; endif; end; |
h) 案例五:动态游标/ref游标
|
--使用动态游标打印员工信息和部门信息 declare v_erow emp%rowtype; v_drow dept%rowtype; --1、定义一个动态游标类型 --弱类型的动态游标 type cur1 isrefcursor; --强类型的动态游标 type cur2 isrefcursorreturn emp%rowtype; --2、使用动态游标类型定义一个动态游标 cur_row cur1; begin --3、打开游标并给游标赋值 open cur_row forselect*from emp; --4、使用loop循环获取游标 dbms_output.put_line('员工信息:'); loop fetch cur_row into v_erow; dbms_output.put_line(v_erow.ename); exitwhen cur_row%notfound; endloop; --5、关闭游标 if cur_row%isopenthen close cur_row; endif; --6、重新打开游标并重新给游标赋值 open cur_row forselect*from dept; --7、使用loop循环获取游标 dbms_output.put_line('部门信息:'); loop fetch cur_row into v_drow; dbms_output.put_line(v_drow.dname); exitwhen cur_row%notfound; endloop; --8、关闭游标 if cur_row%isopenthen close cur_row; endif; end; |
1、
Oracle的自定义函数
2、
Oracle的触发器
3、
Oracle的存储过程
知识点一:自定义函数
语法:create [or replace] function 函数名(参数)
return返回值类型—必须
is
--变量的声明
begin
--执行语句
--return 返回变量
--exception 异常块(return 异常编号)
end;
Java:
int add(int
no1,int no2)
{
int sum = no1+no2;
return sum;
}
Oracle
|
--使用PLSQL developer创建自定义函数,实现两个数字相加 createorreplacefunction fun_add(num1 number,num2 number) returnnumber is v_result number(2); begin v_result := num1+num2; return v_result;
exception whenothersthen return-1; end; |
调用函数
方式一:
|
select |
方式二:
|
declare v_num1 number(2); v_num2 number(2); v_result number(2); begin v_num1 :=&加数1; v_num2 :=&加数2; v_result := fun_add(v_num1,v_num2);
exception whenothersthen end; |
2017-10-31 18:36:17
Oracle 笔记(四)的更多相关文章
- Oracle笔记 四、增删改、事务
1.插入 insert into dept values(50, 'soft', 'Guangzhou'); insert into dept(deptno, dname) values(60, 's ...
- oracle 笔记---(四)__数据字典
数据字典 user_* 该视图存储了关于当前用户所拥有的对象的信息.(即所有在该用户模式下的对象) all_* 该试图存储了当前用户能够访问的对象的信息.(与user_*相比,all_* 并不需要拥 ...
- Oracle笔记 目录索引
Oracle笔记 一.oracle的安装.sqlplus的使用 Oracle笔记 二.常用dba命令行 Oracle笔记 三.function .select Oracle笔记 四.增删改.事务 Or ...
- Oracle笔记(1) 简单查询、限定查询、数据的排序
Oracle笔记(四) 简单查询.限定查询.数据的排序 一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...
- Java加密与解密笔记(四) 高级应用
术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...
- 韩顺平Oracle笔记
韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring 目录(?)[-] ...
- Oracle笔记 多表查询
Oracle笔记 多表查询 本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...
- oracle 笔记
1.Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create databas ...
随机推荐
- 微擎后台进行GET提交
微擎form表单进行GET提交时,要传递 name 分别为 c , a , m , do 的值 例如: <form action="{php echo $this->create ...
- VS开发框架DevExtreme v19.1全解析!全新的UI小部件
行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExtreme Complete Subscription v19.1中全新发布的Dro ...
- 数组扩展运算符 -ES6
1.将数组转为以逗号分隔的序列 2.格式 ...[1,2,3 ] 3.若扩展运算符后面是一个空数组,则不产生效果[ ] 4.用于函数参数 function add(x,y) { console.log ...
- linux下PHP扩展安装memcache模块
linux下PHP扩展安装memcache模块 roid 安装环境RHEL 4Php 5.2.6 所需软件libevent-1.4.6-stable.tar.gz (http://monkey.o ...
- Newsgroups数据集研究
1.数据集介绍 20newsgroups数据集是用于文本分类.文本挖据和信息检索研究的国际标准数据集之一. 数据集收集了大约20,000左右的新闻组文档,均匀分为20个不同主题的新闻组集合. 一些新闻 ...
- C#创建泛型类T的实例的三种方法
原文链接:https://www.cnblogs.com/lxhbky/p/6020612.html 方法一,通过外部方法传入的实例来实例化: //泛型类: public class MySQLHel ...
- QT:圆角设置
Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...
- QT:设置布局边缘
QHBoxLayout * horizontalLayout = new QHBoxLayout; //setContentsMargins(int left, int top, int right, ...
- luogu 3241 [HNOI2015]开店 动态点分治+二分+vector
独立写出来+想出来的,1.5h就切了~ 建立点分树,然后用 $vector$ 暴力存所有子节点,然后二分一下子就可以了. #include <cstdio> #include <ve ...
- Word:表格前添加新行 + 删除表格后的空行
本文适用于Word 2007 + Windows 7,造冰箱的大熊猫@cnblogs 2018/8/3 近日新学(百度到)两条新Word操作,记录下来以备查询 1.在表格前添加新行 场景:有没有遇到过 ...