PL/SQL编程基础
1.如何编写和编译PL/SQL
因为PL/SQL是嵌入在Oracle服务器和Oracle开发工具中的,所以在Oracle客户端的各种工具和服务器中
都可以编写PL/SQL程序
SQL>edit c:\plsqlblock1.sql; --建一个编写的文件
SQL>set serveroutput on; --激活dbms_output包,以便在PL/SQL块中可以引用dbms_output包将变量的值输出在屏幕上
SQL>start c:\plsqlblock1.sql; --编译和运行该PL/SQL块,查看该块是否有语法错误和逻辑错误
注意:在PL/SQL中使用SELECT 语句的语法与标准SQL中的SELECT语法有,其他PL/SQL所支持的SQL命令在标
准SQL和PL/SQL中则没有区别
标准SQL中的SELECT语法如下:
select 列名,列名....
from 表
where 条件....;
在PL/SQL中的SELECT语法为:
SELECT 列名,列名...
into 变量1,变量2...
from 表
where 条件....;
2.PL/SQL程序结构
[DECLARE]--说明部分 要用到的所有变量,常量,数据类型,游标和用户定义的错误等对象的定义
......
BEGIN
..... --主块的语句执行部分
[EXCEPTION] --出错处理部分
END;
/
3.变量定义
NUMBER(数字型),CHARACTER(字符类型),DATE/TIME(日期型)和BOOLEAN(布尔型)
变量[constant]数据类型[not null][:=|DEFAULT PL/SQL表达式];
eg:
V_CHAR VARCHAR2(20);
%TYPE和%ROWTYPE类型
%TYPE即一个变量的类型用另一个已经定义的变量的类型定义,或用某一个表的某一列的类型定义
eg:
BOOKPRINT NUMBER;
V_BOOK BOOKPRINT%TYPE; 用已经定义的BOOKPRINT
V_EMPNO EMP.EMPNO %TYPE; 用EMP表中的EMPNO定义
%ROWTYPE
即一个变量的类型参考基表,视图中记录的类型或游标的结构类型,%ROWTYPE前面是表名或游标名,此类型
的变量内的字段与表或视图,游标内的列的名字和类型完全一致
eg:
V_REC EMP%ROWTYPE
emp代表表名或前面定义的游标名
V_REC.EMPNO:=100;
用户自定义的类型
定义用户自定义的数据类型student_type
SQL>create replace type student_type as object(
id number(5),
firstname varchar2(20),
lastname varchar2(20),
major varchar2(30),
current_credits number(3));
)
引用用户自定义类型V_student student_type;
4.变量赋值
通过:=给变量赋值 变量名:=常量或PL/SQL表达式
或通过SELECT INTO 语句或FETCH INTO 语句给变量赋值
select sal into NUM_VAR from emp where empno = 7788;
5.PL/SQL运算符和函数
注意:PL/SQL中不支持聚组函数
PL/SQL中对空值进行的算术运算和比较运算得到的结果都是NULL,NULL能做字符串的联结,要判断
某一变量的值是否为空不能直接用
等号去判断必须要用IS NULL IS NOT NULL
eg: NULL+(数字)=null
null>(数字)=null
null||'字符串'='字符串'
判断一个变量的值是否为NULL的正确写法如下;
IF my_var is null then
....
end if;
5.PL/SQL的控制结构
(1).条件语句
IF 条件1 THEN
语句系列1;
[ELSIF 条件2 THEN
语句系列2;
...
[ELSF语句系列3;]
END IF;
eg:
DECLARE
V_sal emp.sal%type;
BEGIN
select sal into v_sal from emp where empno=7788;
if v_sal<500 then
update emp set sal=sal*1.5 where empno=7788;
elsif v_sal<1500 then
update emp set sal=sal*1.3 where empno=7788;
elsif v_sal<3000 then
update emp set sal=sal*1.1 where empno=7788;
else
update emp set sal=sal*1.0 where empno=7788;
end if;
commit;
end;
/
(2).CASE语句
1.含selector的CASE语句
[<<label_name>>]
case selector
when 表达式1 then 语句系列1;
when 表达式2 then 语句系列2;
...
when 表达式n then 语句系列n;
[ELSE 语句序列n+1;]
end case[label_name];
6.循环
简单循环
LOOP
END LOOP;
while循环
while ...loop
end loop;
数字式for循环
for ...loop
end loop;
循环体内必须有退出循环的语句EXIT
loop end loop;
DECLARE
V_counter binary_integer:=1;
BEGIN
LOOP
INSERT INTO TEMP_table values(v_counter,'loop index');
V_counter:=v_counter+1;
IF v_counter>50 then
exit;
end if;
end loop;
end;
/
for ...loop end loop;
declare
V_counter NUMBER:=1;
BEGIN
for V_counter IN 1..50 LOOP IN索引的变量从小到大
INSERT INTO temp_table values(V_counter,'loop index');
end loop;
end;
declare
V_counter NUMBER:=1;
BEGIN
for V_counter IN REVERSE 1..50 LOOP IN REVERSE索引的变量从大到小
INSERT INTO temp_table values(V_counter,'loop index');
end loop;
end;
7.标签
为了提高程序的可读性,可以给语句,块,循环加标签(label),标签在一个块或一个循环前面,由双尖括号引起来
用:GOTO + LABEL将控制传递到程序的另一部分
8.出错处理部分
EXCEPTION
WHEN 错误1 [OR 错误2]THEN
语句序列1;
WHEN 错误3[OR 错误4]THEN
语句序列2;
WHEN OTHERS THEN
语句序列3;
END;
(1).系统预定义的错误
(2).用户自定义错误
DECLARE
my_exception EXCEPTION;
用户定义的错误是在语句执行部分通过显式使用RAISE语句来触发的
RAISE 错误名
eg:
查找classes表中历史系101课程的当前学生数与最大学生数,比较这两个数,如果当前学生数超过最大学生
数是不允许的,就触发错误,当这种错误发生时向log_table表中插入一条记录
9.游标的使用
为了能够得到查询结果的多条记录必须使用游标:游标有显示游标和隐式游标
对单条记录的SQL语句的操作都使用隐式游标
(1).定义游标
cursor 游标名[(参数名1 数据类型[,参数名2数据类型...])]
is select 语句;
eg:cursor c1 is select ename,deptno from emp;
(2).打开游标
open 游标名[(实际参数值1[,实际参数值2...])];
(3).取值到变量
Fetch 游标名 into 变量1[,变量2...];
Declare
cursor c_classes is select *from class;
V_classes c_classes%rowtype; /*c_classes是一个游标名,必须先定义该游标*/
BEGIN
...
FETCH c_classes into v_classes;
..
end;
/
(4).关闭游标
close c_classes;
游标的属性
%ISOPEN
%NOTFOUND
%FOUND
%ROWCOUNT
eg:
通过游标用简单循环控制从emp表中取出某一部门的员工姓名和工资
Declare
v_deptno emp.deptno%type:=&p_deptno;/*&p_deptno表示可以在运行时接受输入的变量p_deptno*/
v_ename emp.ename%type;
v_sal emp.sal%type;
cursor emp_cursor is select ename,sal from emp where dptno_v_deptno;
BEGIN
OPEN emp_cursor;
loop
FETCH emp_cursor into v_ename,v_sal;
exit when emp_cursor%notfound;
insert into temp(ename,sal) values(v_ename,v_sal);
end loop;
close emp_cursor;
commit;
end;
/
使用游标的for循环(for循环自动完成的三个步骤:打开游标,取数据,关闭游标);
用游标的for循环实现上述功能如下:
Declare
v_deptno emp.deptno%type:=&p_deptno;
cursor emp_cursor is select ename,sal from emp where deptno=v_deptno;
BEGIN
For emp_record IN emp_cursor loop
insert into temp(ename,sal) values(emp_record.ename,emp_record.sal);/*返回结果在记录名.列名中*/
end loop;
commit;
end;
/
10.通过游标操纵数据库
当通过游标更新,删除多条记录的时候,游标的查询语句中必须包含for update of 否则返回错误,必须先加
锁,然后才能进行更新删除操作
eg:
查询emp表某部门的雇员情况,如果某雇员的工资小于800,则将其工资改成800
Declare
v_deptno emp.deptno%type:=&p_deptno;
v_empno emp.empno%type;
v_sal emp.sal%type;
v_job emp.job%type;
cursor emp_cursor is select empno,job,sal from emp where deptno=v_deptno for update of sal;--表示更新游标取出来的那条记录
BEGIN
for emp_record in emp_cursor loop
if emp_record.sal<800 then
update emp set sal=800 where current of emp_cursor;
end if ;
dbms_output.put_line(emp_record.empno||emp_record.sal);
end loop;
commit;
end;
/
eg:
为职工增加10%的工资,从最低工资开始长,增加后工资总额限制在50万元以内
Declare
cursor c1 is select empno,sal from emp
order by sal for update of sal;
emp_num number:=0;
s_sal emp.sal%type;
e_sal emp.sal%type;
e_empno emp.empno%type;
BEGIN
OPEN c1;
select sum(sal) into s_sal from emp;
while s_sal<500000
loop
FETCH c1 into e_empno,e_sal;
exit when c1%notfound;
update emp set sal=sal*1.1 where current of c1;
s_sal:=s_sal+e_sal*0.1;
emp_num:=emp_num+1;
end loop;
close c1;
insert into msg values(emp_num,s_sal);
commit;
end ;
/
11.带参数的游标
eg:
首先查询DEPT表取出所有的部门号,然后根据DEPT表中返回的每个部门号,从emp表中查询该部门的雇员信息
DECLARE
cursor dept_cursor is select deptno from dept;
v_ename emp.ename%type;
v_sal emp.sal%type;
cursor emp_cursor (v_deptno number) is select ename,sal /*定义带参数的游标*/
from emp where deptno=v_deptno;
Begin
for dept_record in dept_cursor loop
exit when dept_cursor%notfound;
open emp_sursor(dept_record.deptno);/*打开带参数的游标,参数的实际值是外层游标取出的部门号*/
loop
fetch emp_cursor into v_ename,v_sal;
exit when emp_sursor%notfound;
dbms_output.put_line(dept_record.deptno||' '||v_ename||' '||v_sal);
end loop
close emp_cursor;
end loop;
commit;
end;
分享到:
相关推荐
### PL/SQL编程基础知识 #### 一、PL/SQL简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库...
pl/sql编程基础教程,内容丰富,适合初学者学习。
### PL/SQL基础编程知识点详解 #### 一、PL/SQL概述 PL/SQL,全称为Procedural Language for SQL,是Oracle数据库特有的高级程序设计语言。它结合了SQL的数据处理能力和传统编程语言的控制结构,使开发者能够在...
【PL/SQL编程】是Oracle数据库中用于数据库管理和应用程序开发的一种高级过程语言,它结合了SQL查询语言的威力和高级编程语言的灵活性。本章详细介绍了PL/SQL的基础知识,帮助初学者快速掌握该语言。 **4.1 PL/SQL...
这个"PL/SQL最新中文手册"显然是一份详细解释PL/SQL 7.0版本的指南,对于学习和精通Oracle数据库编程至关重要。以下是手册可能涵盖的一些核心知识点: 1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本...
### Oracle PL/SQL编程基础详解 #### 一、PL/SQL概述 PL/SQL,即Procedural Language for SQL,是Oracle数据库专有的扩展性语言,用于增强SQL的功能,使其具备编程语言的能力。通过PL/SQL,开发者可以编写复杂的...
### PL/SQL编程基础知识点详解 #### 一、PL/SQL概述 PL/SQL(Procedural Language for SQL)是一种过程化SQL扩展语言,专为Oracle数据库设计,它结合了SQL的强大数据处理能力和传统程序设计语言的过程化控制能力。...
1. **基础语法**:PL/SQL是过程化SQL,它包含声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量和游标;执行部分包含了SQL语句和流程控制结构,如循环、条件判断等;异常处理部分则用于捕获和处理运行...
PL/SOL是Oracle特有的编程语言,它不仅具有过程编程语言的基本特征(循环、条件分支等),而且还...本书不仅适合于PL/SQL初学者,而且也适合于有经验的PL/SQL编程人员,本书还可以作为Oracle培训班的教材或者辅助材料。
本书《精通Oracle10g PL/SQL编程》为读者提供了一个系统性的学习路径,从基础知识到高级应用,从具体技巧到最佳实践,涵盖了PL/SQL编程的方方面面。通过本书的学习,读者将能够有效地提高Oracle数据库编程的效率和...
Oracle PL/SQL编程是Oracle数据库管理系统中的重要组成部分,它是一种过程化语言,允许开发者编写复杂的数据库应用程序。在本次实验中,我们将重点学习PL/SQL的基本语法、控制结构、复合数据类型以及异常处理技术。 ...
通过学习《精通Oracle.10g.Pl.SQL编程》,读者可以掌握编写高效、可靠的PL/SQL代码的技巧,提升数据库管理和应用开发的能力。书中可能还会包含大量的练习题和案例,以巩固学习效果并培养实际操作能力。Oracle 10g...
通过上述对Oracle 9i PL/SQL程序设计笔记的总结,我们可以看到PL/SQL作为一种强大的数据库编程语言,提供了丰富的功能来支持数据处理、事务控制及业务逻辑的实现。掌握PL/SQL的不同块类型及其使用方法对于开发高效、...
本资源"PL/SQL 核心基础代码"是针对PL/SQL初学者的一个宝贵资料集合,包含了一系列核心基础部分的代码实例,旨在帮助学习者更好地理解和掌握PL/SQL编程。 在PL/SQL中,主要涉及以下几个关键知识点: 1. **声明变量...
#### 一、PL/SQL编程基础 - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性...
Oracle PL/SQL是一种强大的编程语言,它将SQL与过程编程语言的特性相结合,为数据库开发提供了丰富的功能。...通过深入学习这本教材,你将能够掌握Oracle PL/SQL编程,从而有效地设计和实现数据库解决方案。
本书不仅适用于PL/SQL编程的初学者,也适合有一定基础但希望建立更深层次理解的专业人士。 在Oracle 10g的环境下,PL/SQL编程是进行数据库开发的核心技能之一。PL/SQL结合了过程化编程语言的结构化特性以及SQL语句...
《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...
本次实验旨在使学习者深入了解PL/SQL编程的基础知识与实际应用。具体目标包括: 1. **掌握PL/SQL的数据类型和基本语法**:理解PL/SQL中不同数据类型的定义与使用方法,包括字符串类型等。 2. **熟悉控制结构与游标...
在这个“PL/SQL学习资料”压缩包中,包含了十一个PDF文件,覆盖了从基础到进阶的广泛主题。下面我们将详细探讨这些知识点。 1. **PL/SQL基础知识**: - PL/SQL结构:了解块的概念,包括声明部分、执行部分和异常...