Oracle11g R2学习系列 之九 PL/SQL语言
这是个重头戏,如果精通了PL/SQL,毫不夸张的说明精通了Oracle了。PL/SQL由以下三个部分组成(Definition,Manipulation,Control):
DDL:数据定义语言,Create,Alter,Drop等用于执行数据库的任务。
DML:数据操作语言,Select,Insert,Update,Delete等用于操纵数据库中各种对象、检索和修改数据。
DCL:数据控制语言,Grant,Remove等用于安全管理、确定哪些用户可以查看或修改数据库中数据。
PL/SQL的运算符有跟其他语言相似,也有数学运算符(+-*/等)和逻辑运算符(and,or,not),及其电他如赋值符:=,字符串分隔符' 及并置运算符||(这个要留意,ms sql中用的是+,C#及好多其它语言都是+).
变量:数据库与PL/SQL程序之间是通过变量进行数据传递的。基本格式
<变量名><数据类型>[(宽度):=<初始值>]; 例如,定义一个长度为10的变量count,其初始值为1,是varchar2类型。
count varchar2(10) := '';
关于数据类型,PL/SQL支持用户自定义类型。如自定义表类型,记录类型,输入下面的代码会输出abc字样出来。
set serveroutput on
declare
type t_xs is record
(
xh char(6),
xm char(8),
xb char(2),
zy char(12)
);
myxs t_xs;
begin
myxs.xh:='abc';
dbms_output.put_line(myxs.xh);
end;
为了美观和易于读写,以后关键字都大写好了。
如果要申明一个变量,其类型与表中的某列值相同,可以使用%Type属性,即语法是这样子的:
<变量名> 表名.列名%Type; 声明一个变量my_xh与表XSB中的XH列具有相同的数据类型,就可以这样子定义:
my_xh XSB.XH%TYPE;
而用于描述表的行数据的记录的时候,可以使用%RowType属性。一般用于游标,表示一行记录。如下所示利用游标查询出cjb中的所有cj值。记录一行数据的时候,用的就是%RowType属性。
Set ServerOutput On
Declare
Cursor cur
Is
Select xh,kch,cj From cjb;
cur_rec cur%RowType;
Begin
Open cur;
if cur%IsOpen then
loop
Fetch cur into cur_rec;
if cur%found then
Dbms_Output.put_line(cur_rec.cj);
else
exit;
end if;
end loop;
else
Dbms_Output.put_line('Cursoe is closed.');
end if;
Close cur;
End;
常量:程序运行过程中值不变的量。其语法格式:
<常量名>constant<数据类型>:=<值>;
PL/SQL块的基本结构如下所示:
[ DECLARE ]
--声明部分
BEGIN
--执行部分
[EXCEPTION]
--异常处理部分
END
PL/SQL程序的结构跟其它语言大体相同,也有条件,循环,有case 语句,也有Goto语句。整个跟C#差不多,所以,不多列举,相信真要用的时候,自然而会条件反射出if...then...elseif...then...else,或者loop...exit...end loop等。我大概翻看了一下ppt教程,发现循环结构有以下4种:
1.LOOP-EXIT-END循环
语法格式:
LOOP
Run_expression /*执行循环体*/
IF Boolean_expression THEN /*测试Boolean_expression是否符合退出条件*/
EXIT; /*满足退出条件,退出循环*/
END IF;
END LOOP; 2.LOOP-EXIT-WHEN-END循环
除退出条件检测有所区别外,此结构与前一个循环结构类似。
语法格式:
LOOP
Run_expression /*执行循环体*/
EXIT WHEN Boolean_expression /*测试是否符合退出条件*/
END LOOP; 3.WHILE-LOOP-END循环
语法格式:
WHILE Boolean_expression /*测试Boolean_expression是否符合退出条件*/
LOOP
Run_expression /*执行循环体*/
END LOOP; 4.FOR-IN-LOOP-END循环
语法格式:
FOR count IN count_1..count_n /*定义跟踪循环的变量*/
LOOP
Run_expression /*执行循环体*/
END LOOP;
系统内置函数及自定义函数,内置属于API内容,是语言都会有。没什么稀奇,而且一般也差不多。自定义函数就是说使用如下的语法格式创建函数:
CREATE [OR REPLACE] FUNCTION function_name /*函数名称*/
(
parameter_name1, mode1 datatype1, /*参数定义部分*/
parameter_name2, mode2 datatype2,
parameter_name3, mode3 datatype3,
…
)
RETURN return_datatype /*定义返回值类型*/
{IS | AS}
[声明变量]
BEGIN
function_body; /*函数体部分*/
[RETURN scalar_expression;] /*返回语句*/
END [function_name];
包,在定义使用SELECT命令来查询数据库表数据时,一定要使用包头,否则无法实现存储过程的定义。Oracle提供了若干具有特殊功能的内置包。这些具有特殊功能的包如下。
(1)DBMS_ALERT包:用于数据库报警,允许会话间通信。
(2)DBMS_JOB包:用于任务调度服务。
(3)DBMS_LOB包:用于大型对象操作。
(4)DBMS_PIPE包:用于数据库管道,允许会话间通信。
(5)DBMS_SQL包:用于执行动态SQL。
(6)UTL_FILE包:用于文本文件的输入与输出
Oracle11g R2学习系列 之九 PL/SQL语言的更多相关文章
- Oracle11g R2学习系列 之二基本概念和环境介绍
昨天安装好了之后,发现用Chrome打开OEM发现是英文的,搞得我好奇怪:安装时明明自动显示的是中文的,为何会是英文的呢.后来想想会不会是Oracle用的是浏览器的语言呢,果断打开Chrome的设置, ...
- Oracle11g R2学习系列 之七安全性
其实,对于目前我使用的Oracle的水平来看,还达不到使用安全管理的高度,只是作为一个学习来看一下. 关于Oracle的安全管理,一般使用OEM来操作完成好了,入口是:OEM的“服务器”属性页中,选择 ...
- oracle 学习(五)pl/sql语言存储过程&包
首先搞清楚俩概念 存储过程(procedure)&程序包(package) 存储过程:数据库对象之一,可以理解为数据库的子程序,在客户端和服务器端可以直接调用它.触发器是与表直接关联的特殊存储 ...
- Oracle11g R2学习系列 之六数据库链接,快照及序列
Create public database link link_name Connect to user identified by password using 'DBName' 为'DBName ...
- Oracle11g R2学习系列 之五回闪
Oracle里面有一个回闪的操作,这个貌似sql server是没有的.要使用这个功能,需要用到两个时间内部函数 TIMESTAMP和TO_TIMESTAMP.其中,函数TO_TIMESTAMP的语法 ...
- Oracle11g R2学习系列 之一安装篇
前言 最近想去前同事推荐的一个Oracle相关的岗位竞争一下,由于之前没有使用Oracle的相关经验,所以决定学习一下,就算最终岗位应聘不成,至少也有了一些Oracle经验了,说不定哪天就用上了.再说 ...
- Oracle11g R2学习系列 之十 解决EM不能用
不知道是什么原因https://localhost:1158/em,今天突然就不能用了.做了好多搜索也没有解决.现象是在services.msc中,不能重启OracleDBConsole服务,提示: ...
- Oracle11g R2学习系列 之八高级数据类型
所谓的高级数据类型,就是大数据类型,即BCNB(助记词:BC牛逼)+XML数据类型. B:blob,用来存储可变长度的二进制数据. C:clob,主要用来存储可变长度的字符型数据,也就是其他数据库中提 ...
- Oracle11g R2学习系列 之四Maven+Struts+Spring实验
今天试一下Java调用Oracle来看一下.会不会也如昨天实验的一样坑呢?由于我对于Java也接触的不多,所以不打算直接使用该收提供的实验文档,而是自己利用Maven+Struts+Spring来自己 ...
随机推荐
- 分割gbk中文出现乱码的问题解决
近日遇到一个神奇的字“弢(tao)”. 具体的过程是这样的: $list = explode('|', 'abc弢|bc'); var_dump($list); 取得这个分割的结果. 和想象不同,结果 ...
- 网站的优化----首页优化---app调取服务端数据
高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是 ...
- 用windows live writer写博客
用windows live writer写博客了,目前不支持writer的博客,暂时放弃,这正是我用writer写的第一篇内容. 如有知道怎么用weiter配置:凤凰博客.搜狐博客.QQ空间.百度空间 ...
- MongoDB再实测
不用安装,直接解压.. 这些都不是最主要的,,,倒是TOMCAT和NGINX还需要更深入的了解... http://jingyan.baidu.com/article/acf728fd3d398bf8 ...
- ultraedit替换所有空白行 --正则表达式使用
ultraedit替换所有空白行 --正则表达式使用 删除空行: 替换 %[ ^t]++^p 为 空串 删除行尾空格: 替换 [ ^t]+$ 为 空串 删除行首空格: 替换 %[ ^t]+ 为 空串 ...
- Qt中用QSS切分图片
Qt设计时有时需要实现动态按钮,按钮点击时一个状态,鼠标悬浮时一个状态,离开时一个状态,静止时一个状态.可以用一张png长图,使用QSS分段截取,分配给每一个状态. 1.调用函数 SetButt ...
- Wireshark "The NPF driver isn’t running…"(可见的驱动本质上是一个系统服务,使用net start 启动)
前几天重装系统,装上了windows7 RC系统.昨天开始尝试装上了wireshark 这款很强大的网络监视软件,满心欢喜的打开,可是每次打开都会弹出“The NPF driver isn't run ...
- Delphi keydown与keyup、keypress的区别(KeyDown 和KeyUp 通常可以捕获键盘除了PrScrn所有按键)
Shift 是一个集合变量.type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble ...
- VS2015 C#6.0 中的那些新特性(转载)
自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写 只读属性的初始化(Getter-o ...
- BOT、BT、PPP形式介绍(1)
BOT.BT.PPP形式介绍 BOT1.什么是BOT BOT是英文Build-Operate-Transfer的缩写,即“建设-经营-转让”.实质上是基础设施投资.建设和经营的一种方式,以政府 ...