Oracle学习(11):PLSQL程序设计
PL/SQL程序结构及组成
什么是PL/SQL?
SQL长处
经常使用的结合语言
PL/SQL的程序结构
declare
说明部分 (变量说明,光标申明,例外说明〕
begin
语句序列 (DML语句〕…
exception
例外处理语句
End;
/
变量和常量的说明
date, number, boolean,long)
1. 基本数据类型
Number 数字型
Int 整数型
Pls_integer 整数型。产生溢出时出现错误
Binary_integer 整数型。表示带符号的整数
Char 定长字符型,最大255个字符
Varchar2 变长字符型。最大2000个字符
Long 变长字符型,最长2GB
Date 日期型
Boolean 布尔型(TRUE、FALSE、NULL三者取一)
在PL/SQL中使用的数据类型和Oracle数据库中使用的数据类型。有的含义是全然一致的,
有的是有不同的含义的。
2. 基本数据类型变量的定义方法
变量名 类型标识符 [not null]:=值;
declare
age number(3):=26; --长度为3,初始值为26
begin
commit;
end;
当中。定义常量的语法格式:
常量名 constant 类型标识符 [not null]:=值;
declare
pi constant number(9):=3.1415926;--为pi的数字型常量,长度为9,初始值为3.1415926
begin
commit;
end;
if语句
三种if语句
1. IF 条件 THEN 语句1;
语句2;
END IF;
2. IF 条件 THEN 语句序列1;
ESLE 语句序列 2;
END IF;
3. IF 条件 THEN 语句;
ELSIF 语句 THEN 语句;
ELSE 语句;
END IF;
小知识:获取从键盘输入的数据
accept num prompt '请输入一个数字';
pnum number := #
循环语句
三种循环语句
1. WHILE total <= 25000 LOOP
.. .
total : = total + salary;
END LOOP;
2. Loop
EXIT [when 条件];
……
End loop
3. FOR I IN 1 . . 3 LOOP
语句序列 ;
END LOOP ;
光标(Cursor)==ResultSet
说明光标语法:
1.定义光标
CURSOR 光标名 [ (參数名 数据类型[,參数名 数据类型]...)]
IS SELECT 语句;
比如:
cursorc1 is select
ename from
emp;
演示样例
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWh3YzIwMDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
带參数的光标
定义语句:
cursor c2(jobc
varchar2)
is
select ename,salfrom emp
where job=jobc;
运行语句:
Open c2(‘clerk’);
Oracle的异常处理
例外
l例外是程序设计语言提供的一种功能,用来增强程序的健壮性和容错性。
系统定义例外
用户定义例外及处理例外
DECLARE
My_job char(10);
v_sal emp.sal%type;
No_data exception;
cursor c1 is select distinct jobfrom emp order by job;
begin
open c1;
Fetch c1 into v_job;
IF c1%notFOUND then raiseno_data;
end if;
…
EXCEPTION
WHEN no_data THEN insert into empvalues(‘fetch语句没有获得数据或数据已经处理完');
END;
两种赋值语句
利用:=赋值
lvar1:='this is a argument';
lemp_rec.sal:=
sal*2 +
nvl(comm,0);
lsum_sal:=sum_sal+v_sal;
利用into赋值
lFETCH c1 INTO e_eno , e_sal ;
commit语句
使当前事务所运行的所有改动永久化。
凝视
-- This is a comment
或
/* This is a comment */
实例演示样例
演示样例1
为员工长工资。
从最低工资调起每人长10%,但工资总额不能超过50万元,
请计算长工资的人数和长工资后的工资总额,并输出输出长工资人数及工资总额。
先写出可能用到的sql语句
select empno,sal from emp order by sal;
select sum(sal) from emp;
*/
set serveroutput on
declare
cursor c1 is select empno,sal from emp order by sal;
salTotal NUMBER; --记录工资总额
empCount NUMBER := 0; --涨工资的人数
pempno emp.empno% TYPE; --记录员工的编号
psal emp.sal%type; --记录员工的工资
begin
--得到当前总工资
select sum(sal) into salTotal from emp;
--打开游标
open c1;
--运行循环
while salTotal <= 50000
loop
fetch c1 into pempno, psal;--取出一条记录
exit when c1%notfound;
update emp set sal = sal * 1.1 where empno = pempno; --运行加薪
--记录涨工资后的总额
salTotal := salTotal + psal*0.1;
--记录涨工资的人数
empCount := empCount + 1;
end loop;
close c1;
commit;
dbms_output.put_line('涨工资人数:' || empCount || ' 工资总额:' || salTotal);
end;
/
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWh3YzIwMDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
演示样例2
数
3000-6000 大于6000 工资总额
10 2 1 0 8750
20 3 2 0 10875
30 6 0 0 9400
createtable msg1
(deptno number,
emp_num1 number,
emp_num2 number,
emp_num3 number,
sum_salnumber);
用PL/SQL语言编写一程序。实现按部门分段(6000以上、(6000,3000)、3000元下面)统计各工资段的职工人数、
以及各部门的工资总额(工资总额中不包含奖金)
先写出可能用到的查询语句
a = select distinct deptno from dept;
select sal from emp where deptno= a中的某个值;
关于结果的输出:
1. 直接输出在屏幕上
2. 输出到一张表中
create table salcount
(deptno number, --部门号
sg1 int, --3000下面的人数
sg2 int, -- 3000~6000的人数
sg3 int -- 6000以上的人数
);
*/
declare
--定义两个游标保存结果
cursor c1 is select distinct deptno from dept;
cursor c2(pdno number) is select sal from emp where deptno=pdno;
--定义三个变量用于保存每一个部门三个工资段的人数
count1 NUMBER;
count2 number;
count3 number;
--记录c1游标中的部门号
pdeptno dept.deptno% TYPE;
--记录c2游标中的薪水值
psal emp.sal% TYPE;
begin
open c1;--打开c1 获得全部部门号
loop
fetch c1 into pdeptno;--取一个部门号
exit when c1%notfound;
--计数器清零
count1 := 0;
count2 := 0;
count3 := 0;
--得到该部门的全部员工
open c2(pdeptno);
loop
fetch c2 into psal; --得到该员工的工资
exit when c2%notfound;
if psal <=3000 then count1 := count1 + 1;
elsif psal > 3000 and psal <=6000 then count2 := count2 + 1;
else count3 := count3 + 1;
end if;
end loop;
close c2;
--保存该部门的统计结果
insert into salcount values(pdeptno,count1,count2,count3);
commit;
end loop;
close c1;
end;
/
Oracle学习(11):PLSQL程序设计的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- Oracle学习系列1-7
Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...
- 解决中64位Win7系统上PLSQL无法连接ORACLE的方法(PLSQL无法识别ORACLE_HOME的配置)
最近新安装了64位的Win7系统,工作中需要用oracle数据库,而数据库是公司IT的DBA进行管理和维护的. 我们只需要连接上去进行使用就可以了,于是我就在自己的机器上安装了oracle clien ...
- oracle学习 第二章 限制性查询和数据的排序 ——03
这里.我们接着上一小节2.6留下的问题:假设要查询的字符串中含有"_"或"%".又该如何处理呢? 開始今天的学习. 2.7 怎样使用转义(escape)操作符 ...
- oracle学习 第一章 简单的查询语句 ——03
1.1最简单的查询语句 例 1-1 SQL> select * from emp; 例 1-1 结果 这里的 * 号表示全部的列.它与在select 之后列出全部的列名是一样的.查询语句以分号( ...
- Oracle:使用PL-SQL登录时报ORA-12541:无监听程序的解决办法
背景: 在自己公司安装的Oracle,当时Oracle的监听地址都是写的公司的地址 后来由于项目需要,办公地点转移到了客户处, 大概有半年没有以sys用户登录数据库了. 最近在上下班途中学习Djang ...
- csharp: ODP.NET,System.Data.OracleClient(.net 4.0) and System.Data.OleDb读取Oracle g 11.2.0的区别
ODP.NET: 引用: using Oracle.DataAccess; //Oracle g 11.2.0 using Oracle.DataAccess.Client; using Oracle ...
- 【oracle】oracle学习笔记2--scoot账户的激活与解锁
1.用sysz账户as sysddba登录,并执行scott.sql文件.我的文件目录是C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin ...
- Oracle学习指南
Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...
随机推荐
- N数码问题的启发式搜索算法--A*算法python实现
一.启发式搜索:A算法 1)评价函数的一般形式 : f(n) = g(n) + h(n) g(n):从S0到Sn的实际代价(搜索的横向因子) h(n):从N到目标节点的估计代价,称为启发函数(搜索的纵 ...
- Redis Sentinel哨兵配置
概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...
- ps -aux ,ps aux ,ps -ef 的区别
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- Redis五种数据类型及应用场景
MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加 ...
- HBase编程 API入门系列之delete(管理端而言)(9)
大家,若是看过我前期的这篇博客的话,则 HBase编程 API入门之delete(客户端而言) 就知道,在这篇博文里,我是在客户端里删除HBase表的. 这里,我带领大家,学习更高级的,因为,在开发中 ...
- hdu4081 Qin Shi Huang's National Road System 次小生成树
先发发牢骚:图论500题上说这题是最小生成树+DFS,网上搜题解也有人这么做.但是其实就是次小生成树.次小生成树完全当模版题.其中有一个小细节没注意,导致我几个小时一直在找错.有了模版要会用模版,然后 ...
- 几个概念:x86、x86-64和IA-32、IA-64
最近在学习操作系统方面的知识,学习操作系统难免要和CPU打交道,虽然现在CPU和操作系统不像计算机发展初期一样是绑定在一起的,但是大家都知道操作系统和CPU Architecture的联系是很紧密的, ...
- js代码 注释 test
<script type="text/javascript"> var obj = { tyep: 'GET', url: '/Backstage/Home/Menu' ...
- 任务调度开源框架Quartz概述
任务调度开源框架Quartz 几乎每个项目中都用到了自动任务处理功能.所以在任务调度的功能很常用,但是一个好的任务调度程序是一个颇具挑战性的工作.最近用到Quartz这个框架,感觉很好,所以进行学习. ...
- 「Poetize4」创世纪
在tyvj上怀疑爆栈了.....或许一定是我写挂了.以后调吧... UPD:bzoj上过了... 题解:https://blog.csdn.net/popoqqq/article/details/39 ...