Oracle学习笔记之PL/SQL编程
SQL(Structure Query Language)的含义是结构化查询语句,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言。1976年,IBM公司的San Jose研究所在研制关系数据库管理系统System R时修改为SEQUEL2,即目前的SQL语言。1976年,SQL开始在商品化关系数据库管理系统中应用。1982年美国国家标准化组织ANSI确认SQL为数据库系统的工业标准。目前,许多关系型数据库供应商都在自己的数据库中支持SQL语言,如:Access、Sybase、SQL Server、Infomix、DB2等。
PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算的程序语言。
用PL/SQL编制的程序代码如下所示:
DECLARE
xm varchar2(8):=’丽丽’;
zym varchar2(10):=’计算机’;
zxf number(2):=45;
A integer:=1;
BEGIN
UPDATE XS
SET zxf=zx
WHERE xm=xm; /*更新学生表*/
IF SQL%NOTFOUND THEN /*检查记录是否存在,如果不存在就插入记录*/
INSERT INTO XS(XH,XM,ZYM,ZXF)
VALUES(1,xm,zym,zxf);
END IF;
END;
合法字符:
在使用PL/SQL进行程序设计时,可以使用的有效字符包
括以下3类:
(1)所有的大写和小写英文字母;
(2)数字0~9;
(3)符号() + - * / <> = ! ~ ;:. ` @ % , " # ^ & _ { } ? [ ]。
PL/SQL标识符的最大长度为30个字符,不区分大小写,但是适当地使用大小写可以提高程序的可读性。

PL/SQL中变量声明格式:
(1) 变量必须以字母(A~Z)开头
(2) 其后跟可选的一个或多个字母、数字(0~9)或特殊字符$、# 或_
(3) 变量长度不超过30个字符
(4) 变量名中不能有空格

常用数据类型:
(1)VARCHAR类型:
语法格式:
var_field VARCHAR(n);
其中长度值n是本变量的最大长度且必须是正整数,例如:
var_field VARCHAR(11);
在定义变量时,可以同时对其进行初始化,例如:
var_field VARCHAR(11):=’Hello world’;
(2)NUMBER类型:
NUMBER数据类型可用来表示所有的数值类型。
语法格式:
num_field NUMBER(precision,scale);
其中precision表示总的位数;scale表示小数的位数,scale缺省表示小
数位为0。如果实际数据超出设定精度则出现错误。例如:
num_field NUMBER(10,2);
num_field是一个整数部分最多使8位,小数部分最多是2的变量。
declare
v_no number:=10;
begin
v_no:=v_no/0;
dbms_output.put_line(v_no);
exception
when others then
dbms_output.put_line('分母不能为0');
end;
(3)DATE类型:
用来存放日期时间类型数据,用7个字节分别描述年、月、日、时、
分、秒。
语法格式:
date_field DATE;
日期缺省格式为DD-MON-YY,分别对应日、月、年,例如17-JUN-
2002。注意,月份的表达要用英文单词的缩写格式。日期的格式可
以设置为中文格式,例如17-六月-2002。
(4)BOOLEAN类型:
逻辑型(布尔型)变量的值只有true(真)或false(假)。逻辑型变量一般用
于判断状态,然后根据其值是“真”或是“假”来决定程序执行分支。关
系表达式的值就是一个逻辑值。
注意:boolean类型变量不能直接通过 dbms_output.put_line(参数);直接输出,如果想输出,必须通过if判断;
条件判断语句:
IF逻辑结构
IF逻辑结构有3种表达式。
(1) IF-THEN
语法格式:
IF Boolean_expression THEN /*条件表达式*/
Run_expression /*条件表达式为真时执行*/
END IF
(2) IF-THEN-ELSE
语法格式:
IF Boolean_expression THEN /*条件表达式*/
Run_expression /*条件表达式为真时执行*/
ELSE
Run_expression /*条件表达式为假时执行*/
END IF;
(3) IF-THEN-ELSIF-THEN-ELSE
语法格式:
IF Boolean_expression1 THEN
Run_expression1
ELSIF Boolean_expression2 THEN
Run_expression2
ELSE
Run_expression3
END IF;
declare
i number:=10;
begin
if i<=0
then
dbms_output.put_line('分母不能为0');
else
dbms_output.put_line('分母不能为2');
end if;
end;
declare
v_no number:=1000;
begin
if v_no>1000 then
dbms_output.put_line('1');
elsif v_no=1000 then
dbms_output.put_line('2');
else
dbms_output.put_line('3');
end if;
end;
循环操作语句:
(1) LOOP-EXIT-END循环
语法格式:
LOOP
Run_expression /*执行循环体*/
IF Boolean_expression THEN /*测试Boolean_expression是否符合退出条件*/
EXIT; /*满足退出条件,退出循环*/
END IF;
END LOOP;
declare
i number;
begin
for i in 1..10
loop
dbms_output.put_line(i);
end loop;
end;
declare
i number;
sum1 number:=0;
begin
for i in 1..10
loop
sum1:=sum1 +i;
end loop;
dbms_output.put_line(sum1);
end;
--例:求10的阶乘。
DECLARE
n NUMBER:=1;
count1 NUMBER:=2;
BEGIN
LOOP
n:=n*count1;
count1:=count1+1;
IF count1>10THEN
EXIT;
ENDIF;
ENDLOOP;
dbms_output.put_line(to_char(n));
END;
(2)LOOP-EXIT-WHEN-END循环
除退出条件检测有所区别外,此结构与前一个循环结构
类似。
语法格式:
LOOP
Run_expression /*执行循环体*/
EXIT WHEN Boolean_expression /*测试是否符合退出条件*/
END LOOP;
--例:求10的阶乘。
DECLARE
n NUMBER:=1;
count1 NUMBER:=2;
BEGIN
LOOP
n:=n*count1;
count1:=count1+1;
EXITWHEN count1=11;
ENDLOOP;
dbms_output.put_line(to_char(n));
END;
(3)WHILE-LOOP-END循环
语法格式:
WHILE Boolean_expression /*测试Boolean_expression是否符合退出条件*/
LOOP
Run_expression /*执行循环体*/
END LOOP;
--例:用WHILE-LOOP-END循环结构求10的阶层。
DECLARE
n NUMBER:=1;
count1 NUMBER:=2;
BEGIN
WHILE count1<=10
LOOP
n:=n*count1;
count1:=count1+1;
ENDLOOP;
dbms_output.put_line(to_char(n));
END;
(4) FOR-IN-LOOP-END循环
语法格式:
FOR count IN count_1..count_n /*定义跟踪循环的变量*/
LOOP
Run_expression /*执行循环体*/
END LOOP;
--例:用FOR-IN-LOOP-END循环结构求10的阶层。
DECLARE
n NUMBER:=1;
count1 NUMBER;
BEGIN
FOR count1 IN2..10
LOOP
n:=n*count1;
ENDLOOP;
dbms_output.put_line(to_char(n));
END;
逻辑判断语句:
1. CASE语句
CASE语句是在Oracle9i才引入的。
语法格式:
CASE input_name
WHEN expression1 THEN result_expression1
WHEN expression2 THEN result_expression2
…
WHEN expressionN THEN result_expression
[ELSE result_expressionN]
END;
例如:
DECLARE
ename_1 varchar2(20);
empno_1 varchar2(16);
v_Result varchar2(20);
BEGIN
SELECT empno,ename
INTO empno_1,ename_1
FROM emp
WHERE empno='7369';
CASE length(ename_1)/*判断v_kch的值,并给出结果 */
WHEN1THEN v_Result:='名字有1个字符';
WHEN2THEN v_Result:='名字有2个字符';
WHEN3THEN v_Result:='名字有3个字符';
WHEN4THEN v_Result:='名字有4个字符';
when5then v_result:='名字有5个字符';
ELSE
v_Result:='Nothing';
ENDCASE;
dbms_output.put_line(v_result||':'||ename_1);
END;
(5)使用%TYPE
%TYPE属性提供了变量和数据库列的数据类型。
my_xh XS.XH%TYPE;即:变量名 表名.列名%TYPE; 表示该属性为某个表中的某个列的类型一致;
使用%TYPE声明具有以下两个优点:
① 不必知道XH列的确切的数据类型;
② 如果改变了XH列的数据库定义,my_xh的数据类型在运行时会自动进行修改。
例如:
-- Created on 2017/10/19 by ADMINISTRATOR
declare
employeeNO emp.empno%type;--声明employeeNO 属性类型为emp表的empno列类型一致;
employeeName emp.ename%type;
deptNO number(5);
deptName varchar2(20);
i char(1):=2;
begin
if i=1then--注意比较通过一个=号
select deptno,dName into deptNO,deptName from dept where deptno=20;
dbms_output.put_line('查询部门20的编号以及部门名称:'||deptno||':'||deptName);
else
select empno,ename into employeeNO ,employeeName from emp where empno=7369;
dbms_output.put_line('查询7369员工编号以及姓名:'||employeeNO||':'||employeeName);
endif;
end;
(6) E emp%ROWTYPE
可以使用%ROWTYPE属性声明描述表的行数据的记录;
例如:
-- Created on 2017/10/19 by ADMINISTRATOR
declare
employee emp%rowtype;--声明employee 属性类型为emp表行类型一致;
department dept%rowType;--声明deptartment变量为dept行类型;
i number(5):=2;
begin
if i=1then--注意比较通过一个=号
select deptno,dName into department.deptno,department.dname from dept where deptno=20;--可以直接将某列赋值给该变量中的某个字段
dbms_output.put_line('查询部门20的编号以及部门名称:'||department.deptno||':'||department.dname);
else
select emp.*into employee from emp where empno=7369;--可以直接将正行赋值给该变量
dbms_output.put_line('查询7369员工编号以及姓名:'||employee.empno||':'||employee.ename||':'||employee.hiredate);
endif;
end;
(7)数组类型:数据是具有相同数据类型的一组成员的集合。在PL/SQL中,数组数据类型是VARRAY。 定义VARRY数据类型语法如:
TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL
例如:
DECLARE
--定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
TYPE reg_varray_type ISVARRAY(5)OFVARCHAR(25);
--声明一个该VARRAY数据类型的变量
v_reg_varray REG_VARRAY_TYPE;
BEGIN
--用构造函数语法赋予初值
v_reg_varray := reg_varray_type ('中国','美国','英国','日本','法国');
DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_varray(1)||'、'
||v_reg_varray(2)||'、'
||v_reg_varray(3)||'、'
||v_reg_varray(4));
DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值:'||v_reg_varray(5));
--用构造函数语法赋予初值后就可以这样对成员赋值
v_reg_varray(5):='法国';
DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_varray(5));
END;
(8)record用户定义的记录,必须声明自己的域。记录包含唯一的命名域,具有不同的数据类型。
DECLARE
TYPE TimeRec IS RECORD(HH number(2),MM number(2));
TYPE MeetingTyp IS RECORD
(
Meeting_Date date,
Meeting_Time TimeRec,
Meeting_Addr varchar2(20),
Meeting_Purpose varchar2(50)
)
例如:
declare
--type声明一种自定义类型, is record表示该类型中包含有哪些属性
TYPE TimeRec ISRECORD(empno number(10),deptno number(5));
a timeRec;--a变量为我们声明timeRec类型
begin
select empno,deptno into a from emp where empno=7369;--into 表示赋值,注意一条语句中只能使用一次 且返回结果不能多条记录
dbms_output.put_line(a.empno);--表示输出
end;
Oracle学习笔记之PL/SQL编程的更多相关文章
- 吴裕雄--天生自然ORACLE数据库学习笔记:PL/SQL编程
set serveroutput on declare a ; b ; c number; begin c:=(a+b)/(a-b); dbms_output.put_line(c); excepti ...
- Oracle学习DaySix(PL/SQL续)
一.游标 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现.游标是一个指向上下文的句柄( handle)或指针.通过游标,PL/SQL 可以控制上下文区和处理语句时上 下文区会发生些 ...
- Oracle学习笔记之四,SQL语言入门
1. SQL语言概述 1.1 SQL语言特点 集合性,SQL可以的高层的数据结构上进行工作,工作时不是单条地处理记录,而对数据进行成组的处理. 统一性,操作任务主要包括:查询数据:插入.修改和删除数据 ...
- Oracle学习DayFive(PL/SQL)
一.PL/SQL简介 PL/SQL 是 Procedure Language & Structured Query Language 的缩写.PL/SQL 是对 SQL 语言存储过程语言的扩 ...
- Oracle学习(十一):PL/SQL
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/v123411739/article/details/30231659 1.知识点:能够对照以下的录屏 ...
- Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...
- Oracle学习笔记_02_基本SQL
1.select语句 (1)语法 SELECT *|{[DISTINCT] column|expression [alias],...} FROM table; (2)示例: 选择全部列 SELECT ...
- Oracle学习笔记之四sp1,Oracle 11g的常用函数
从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i) 分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
随机推荐
- 201521123121 《Java程序设计》第2周学习总结
1. 本周学习总结 通过分析数据所需要占用的内存长度来决定java的类型,其中主要分为基本类型和长类型. 基本类型主要分为五个方面:整数(short=2字节:int=4字节:long=8字节):字节( ...
- ArrayList和LinkedList区别及性能测试
ArrayList和LinkedList是Java Lis接口的2个实现.它们的区别如下表所示: 底层结构 强项 弱项 ArrayList 数组 随机访问get和set 插入删除 LinkedList ...
- 201521123019 《Java程序设计》第9周学习总结
1. 本章学习总结 2. 书面作业 一.题目5-1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答:经常会出现Ar ...
- Linux下Birt、JTreeChart中文乱码问题解决办法
Linux下JTreeChart,Birt等报表工具显示中文乱码解决 1) 现象: 在Windows上生成的报表图片展示正常,但是在Linux上显示(怪异的小方块“口”): 2)问题定位: 这是lin ...
- Java简单实用方法一
整理以前的笔记,在学习Java时候,经常会用到一些方法.虽然简单但是经常使用.因此做成笔记,方便以后查阅 这篇博文先说明构造和使用这些方法. 1,判断String类型数据是否为空 String类型的数 ...
- 原型模式和基于原型继承的js对象系统
像同样基于原型编程的Io语言一样,javascript在原型继承方面,实现原理和Io非常类似,javascript也遵守这些原则 所有数据都是对象 要得到一个对象,不是通过实例化类,而是找到一个对象作 ...
- window、linux系统与linux服务器之间使用svn同步及自动部署代码的方法
摘要: 在家用PC,在公司用办公电脑对一个项目的代码进行修改时,会遇到代码同步的问题.本文讲解了代码同步及自动部署的解决办法. 实现方法: 1.首先在linux服务器上和linux上安装svn(sud ...
- GitHub使用(三) - GitHub安装及初步使用
1. 首先下载Windows版本“GitHubSetup.exe”如下,下载地址为:https://desktop.github.com/
- UIScollview 添加UICollectionView 实现放大缩小
创建一个空的工程 打开storyboard,添加UIScollview 设置代理 实现代理方法 - (UIView *)viewForZoomingInScrollView:(UIScrollView ...
- oracle 行转列 列转行
行转列 这是一个Oracle的列转行函数:LISTAGG() 先看示例代码: with temp as( select 'China' nation ,'Guangzhou' city from du ...