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

            
dbms_output.put_line
('输入错误!');

return-1;

end;

调用函数

方式一:

select
fun_add(50,50) from dual;

方式二:

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);

 

 
dbms_output.put_line
(v_result);

exception

whenothersthen

              
dbms_output.put_line
('输入的数据有误!!');

end;

2017-10-31 18:36:17

Oracle 笔记(四)的更多相关文章

  1. Oracle笔记 四、增删改、事务

    1.插入 insert into dept values(50, 'soft', 'Guangzhou'); insert into dept(deptno, dname) values(60, 's ...

  2. oracle 笔记---(四)__数据字典

    数据字典 user_*  该视图存储了关于当前用户所拥有的对象的信息.(即所有在该用户模式下的对象) all_* 该试图存储了当前用户能够访问的对象的信息.(与user_*相比,all_* 并不需要拥 ...

  3. Oracle笔记 目录索引

    Oracle笔记 一.oracle的安装.sqlplus的使用 Oracle笔记 二.常用dba命令行 Oracle笔记 三.function .select Oracle笔记 四.增删改.事务 Or ...

  4. Oracle笔记(1) 简单查询、限定查询、数据的排序

    Oracle笔记(四) 简单查询.限定查询.数据的排序   一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及 ...

  5. Java加密与解密笔记(四) 高级应用

    术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...

  6. 韩顺平Oracle笔记

    韩顺平Oracle笔记 分类: DataBase2011-09-07 10:24 3009人阅读 评论(0) 收藏 举报 oracle数据库sqljdbcsystemstring   目录(?)[-] ...

  7. Oracle笔记 多表查询

    Oracle笔记  多表查询   本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查 ...

  8. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  9. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来

    本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9327377 作者:七十一雾央 新浪微博:http:// ...

  10. oracle 笔记

    1.Oracle认证,与其它数据库比较,安装 Oracle安装会自动的生成sys用户和system用户: (1)sys用户是超级用户,具有最高权限,具有sysdba角色,有create databas ...

随机推荐

  1. Open Project' has encountered a problem

    用Eclipse作android开发时,打开IDE,经常有的工程目录点击后会出现下面的问题提示: 这种情况往往是工程文件夹中的.project文件丢失了,所以从别的工程复制过来,就可以用啦.

  2. UVA - 11996 Jewel Magic (Treap+二分哈希)

    维护一个01序列,一共四种操作: 1.插入一个数 2.删除一个数 3.反转一个区间 4.查询两个后缀的LCP 用Splay或者Treap都可以做,维护哈希值,二分求LCP即可. 注意反转序列的时候序列 ...

  3. HihoCoder1076 与链(数位DP)

    时间限制:24000ms 单点时限:3000ms 内存限制:256MB 描述 给定 n 和 k.计算有多少长度为 k 的数组 a1, a2, ..., ak,(0≤ai) 满足: a1 + a2 +  ...

  4. 【洛谷P4173】残缺的字符串

    题目大意:给定一个文本串和一个模板串,串中含有通配符,求文本串中有多少个位置可以与文本串完全匹配. 题解:利用卷积求解字符串匹配问题. 通配符字符串匹配的数值表示为 \[\sum\limits_{i ...

  5. 原型模式故事链(5)--JS变量作用域、作用域链、闭包

    上一章 JS执行上下文.变量提升.函数声明 传送门:https://segmentfault.com/a/11... 本次我们主要讲讲变量作用域和闭包变量作用域:顾名思义:变量起作用的范围.变量分为全 ...

  6. Vue处理跨域

    Vue处理ajax跨域 一般处理跨域有好几种方式,jsonp,document.domain, post Message...,今天我们主要来谈谈vue 通过代理方式来实现跨域 安装 npm inst ...

  7. 【C#-读取XML文件】XMLReader读取XML文档

    使用   XmlReader.Create("文件路径")   加载xml文件 XmlReader使用流的方式来读取. //使用XMLReader读取XML数据 XmlReader ...

  8. input输入框如何只能输入非零开头的正整数

    input输入框如何只能输入非零开头的正整数 ********* 废话不多说,先来代码 ********* case1: 原生html + javascript <body> <!- ...

  9. 论文阅读:Forwarding Metamorphosis: Fast Programmable Match-Action Processing in Hardware for SDN

    摘要: 在软件定义网络中,控制平面在物理上与转发平面分离,控制软件使用开放接口(例如OpenFlow)对转发平面(例如,交换机和路由器)进行编程. 本文旨在克服当前交换芯片和OpenFlow协议的两个 ...

  10. 我不熟悉的set

    同样的我着重介绍那些我不怎么用到的系列,同时,常用的我就点一下. 我们都知道set底层是用红黑树实现的,红黑树是一种已排序的树,所以我们通过迭代器来访问节点元素的时候,并不可以改变它,如果随意改变,那 ...