当前位置:
文档之家› PLSQL程序设计(基础篇)
PLSQL程序设计(基础篇)
目录
PL/SQL程序设计(上册)1
第一章认识PL/SQL3
第二章SQL回顾5
第三章PL/SQL的基本结构7
第四章PL/SQL的数据类型及使用10
第五章流程控制29
第六章游标35
第七章异常处理46
第八章下册预知49
这一章主要记录了两个问题:1什么是PL/SQL?2 PL/SQL有什么优势?下面从这两个问题展开论述。
dbms_output.put_line('Oracle第一个员工的信息:');
dbms_output.put_line('员工号:'||eno);
dbms_output.put_line('员工姓名:'||empname);
dbms_output.put_line('职位:'||empjob);
end;
binary_float和binary_double是Oracle 10g的新数据类型,注意在赋值时格式分别如下:223.4323f和23423.4545d,像Java吧,可能都遵循IEEE-754的浮点数标准吧。
布尔:Boolean
布尔值分别为:TRUE、FALSE、NULL
日期:Date和Timestamp
按照形式,可分为命名的PL/SQL和匿名的PL/SQL,其中,命名的,又可以分为子程序和触发器,而子程序又可以分为包、函数、过程。是不是有点儿 ?不过不要紧,等你看过整个文章,再回来看就是很简单了。
PL/SQL的基本结构如下:
Declare
在这里可以定义变量、常量、异常等。
Begin
在这儿可以写一些执行SQL或PL/SQL语句。
本章将从PL/SQL的分类、PL/SQL的基本结构以及第一个PL/SQL程序展开。
PL/SQL的分类:
按照PL/SQL的运行环境,可以分为客户端PL/SQL和服务器端PL/SQL。通常,我们(指开发者)接触到的PL/SQL都是存储在服务器Oracle数据库中的,所以主要学习这一种就可以了,至于客户端的PL/SQL,我也不太了解啊…,o(︶︿︶)o唉希望大虾在与我联系,加上啊!
所以在使用时一定注意,带有group by后,having和select中只能有-分组字段和聚集函数
DML:
insert into values就不再重复了,不过听说现在可以一次性向多个表中插入呢,使用insert into all和insert into first,具体用法如下:
insert into all/first
Date默认只显示日期,而Timestamp默认情况下会显示时间信息,还有上下午标志呢,Timestamp是Oracle 9i新加入的数据类型。
标量的定义格式:
vname DATATYPE [CONSTANT][NOT NULL] [:= / DEFAULT exp]
例如:
name varchar2(30);
PL/SQL的变量类型可以分为标量、复合类型、参照类型和LOB类型四类,下面就分别介绍给大家。
标量,就是单值变量,这么说应该可以理解吧。常用的类型如下:
字符串:varchar2(n)、char(n)、long、long raw
在程序设计中,常常用到字符串的处理,在PL/SQL中,有很好的支持,不但有字符串函数,还有对正则表达式的支持。我们最常用的数据类型就是varchar2(n)了,n用于最大字符长度。其中,char和long、long raw不推荐使用,原因是:前者浪费资源后者不够灵活。
dbms_output.put_line(msg);--内置包使用
end;
运行结果:
Hello World
PL/SQL的注释可以通过这个程序看出来啊,自己看吧,不多说了…
本章将介绍PL/SQL的数据类型,有些数据类型很“简单”,有些很难理解,不过都是因为这些数据类型你没有使用过,用几次就知道了,在这里,先认识认识它们,不熟也没关系。
from emp left outer join dept-- 1确定表
using(deptno)
where deptno > 0-- 2确定行(记录)
group by dname-- 3将行分组
having max(comm) is null or max(comm) > 0-- 4对组筛选
order by dname-- 6对结果集排序
如上的源码表示了SQL语句的执行顺序,这个一定要理解好啊!
思考题:
问题:为什么带有group by的select和having只能含有分组字段和聚集函数呢?
答:因为group by分组后,只能对组进行操作了。也就是说,无论你是筛选行having还是列select,都要以组为单位进行,所以只能使用组共有的属性,除了分组字段外,只有像什么每组的最大值啊、最小值啊、平均值啊等等这些组的特性或叫组员共有的特性。
Exception
这儿可以捕获并处理异常
怎样在发生异常后让程序继续执行其他语句呢?
答:写在这块儿不就得了,呵呵
End;结束了,别忘了“;”啊,呵呵
你的第一个程序?也是我的,“hello, world!”
有人说hello world太老套了,boring,有什么,在你什么都不懂时还能开发出更高级的么,我们就hello world呵呵。
什么是PL/SQL?
PL/SQL即procedural language/standard query language, PL/SQL是具备程序设计语言特性(如:定义变量、流程控制、面向对象等)的、关系数据库标准查询语言SQL的过程性拓展(procedural extension)。
SQL是非过程语言,非过程,让我理解,就是不用你了解语句的处理过程,而直接达到开发者的目的。如:select name from student这条语句,就是向数据库说:“我要学生的姓名”,然后数据库就会返回相应的字段值而我们并不知道它是如何处理的也基本无法控制。而PL/SQL语言,则具备程序设计语言甚至高级程序设计语言的特点,更好地满足我们对数据的操作。
PL/SQL有什么优势?
PL/SQL的优势可以概括为以下五点(待补充):
1具备程序设计语言的特性(模块化、信息隐藏、面向对象等);
2异常处理,PL/SQL具备异常处理的机制;
3可移植,想想Java吧,看看两者有什么共同之处?PL/SQL的JVM就是Oracle Server,呵呵
4改善性能,一方面,通过PL/SQL语句块(Block)可以一次性向Oracle Server发送多个SQL语句,减少网络的传输;另一方面,有些PL/SQL可以在客户端执行(前提是某些客户端含有PL/SQL引擎),可以有效的减少与Oracle Server的交互;再有,PL/SQL通常会存储在Oracle数据库中,这对于网络程序来说真是天降福音,因为,这样一系列的处理交互,都可以以一个调用数据库本身存在的程序而完成,大大提高了性能。
when条件then into表1
when条件then into表2
when条件then into表3
else into表4
select from表源
至于ALL和FIRST的区别就是:如果是ALL,就会插入所有满足条件的表,而如果是FIRST直插入第一个满足条件的表。
TCL:
commit;
rollback to A;
savepoint A;
不多写了,因为我也只知道这点儿了,呵呵,不过听说SQL有个优化hint挺好玩,如:insert /+append+/ into table values XXX;还有对Group by的拓展rollup和cube,还有grouping函数、group set等,以后再研究把,谁让俺是菜鸟呢?
5可以与SQL交互,在PL/SQL中可以嵌入SQL的DML、DQL、TCL(事务控制语言)语句。
你都开始对PL/SQL感性趣了,那么SQL肯定是多多少少听说过的,呵呵,就回顾一些基础吧,那些拓展的内容,建议是遇见了再研究吧。
DQL:
源码dql.sql:
select dname, max(sal)-- 5对列筛选(分组字段或聚集函数)
光说不练犯晕啊,呵呵,下面就看一些记录的应用吧。
源码record.tst:
-- Created on 2010-4-27 by Quasar
declare
--通过自定义和%ROWTYPE属性定义变量
REAL_NAME varchar2(30) constant default ‘魏照哲’;
name varchar2(10) := ‘hello’;
下面是一个标量使用的例子程序:
源码:scalar.tst
例子程序来自scott/scott用户或hr/hr用户(alter user scott account unlock解锁)
数字:number(m, n)、binary_integer、binary_float、binary_double
对于数字类型,number是不错的选择,那么m, n代表什么呢?如果定义为number(6, 2)则代表整数位最大长度是4,小数位最大长度是2,你猜猜吧,m和n的含义。
其中,binary_integer在定义表时是很常用的。
由于是学习笔记么,说是教程,其实是在吸引大家的注意,呵呵,主要是想在方便大家查阅和入门者入门外,希望大家多多指教,多多提出意见,共同把这块知识学熟、学通、学透。
Quasar Wei’s Email:quasarbrave@
Quasar Wei’s QQ: 734089783
Quasar Wei’s Real Name: WeiZhaozhe of NEU
源码:
说明:源码都是由PL/SQL Developer 8开发,于Oracle10g测试