`
quningstudy
  • 浏览: 52864 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

PL/SQL编程基础 学习总结

阅读更多
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简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库...

    第16章Pl/sql编程基础

    pl/sql编程基础教程,内容丰富,适合初学者学习。

    PL/SQL基础编程,实例自写

    ### PL/SQL基础编程知识点详解 #### 一、PL/SQL概述 PL/SQL,全称为Procedural Language for SQL,是Oracle数据库特有的高级程序设计语言。它结合了SQL的数据处理能力和传统编程语言的控制结构,使开发者能够在...

    PL/SQL编程(电子版)

    【PL/SQL编程】是Oracle数据库中用于数据库管理和应用程序开发的一种高级过程语言,它结合了SQL查询语言的威力和高级编程语言的灵活性。本章详细介绍了PL/SQL的基础知识,帮助初学者快速掌握该语言。 **4.1 PL/SQL...

    pl/sql最新中文手册

    这个"PL/SQL最新中文手册"显然是一份详细解释PL/SQL 7.0版本的指南,对于学习和精通Oracle数据库编程至关重要。以下是手册可能涵盖的一些核心知识点: 1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本...

    Oracle PL/SQL编程基础

    ### Oracle PL/SQL编程基础详解 #### 一、PL/SQL概述 PL/SQL,即Procedural Language for SQL,是Oracle数据库专有的扩展性语言,用于增强SQL的功能,使其具备编程语言的能力。通过PL/SQL,开发者可以编写复杂的...

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    它是SQL的扩展,允许开发者在SQL的基础上添加过程化编程元素,如循环、条件判断和子程序等,使得数据库管理与应用开发更为灵活高效。 在PL/SQL中,我们可以编写存储过程、函数、触发器、游标和异常处理等。这些组件...

    pl/sql 编程基础

    ### PL/SQL编程基础知识点详解 #### 一、PL/SQL概述 PL/SQL(Procedural Language for SQL)是一种过程化SQL扩展语言,专为Oracle数据库设计,它结合了SQL的强大数据处理能力和传统程序设计语言的过程化控制能力。...

    精通Oracle 10g PL/SQL编程

    PL/SOL是Oracle特有的编程语言,它不仅具有过程编程语言的基本特征(循环、条件分支等),而且还...本书不仅适合于PL/SQL初学者,而且也适合于有经验的PL/SQL编程人员,本书还可以作为Oracle培训班的教材或者辅助材料。

    精通oracle10g PL/SQL编程

    本书《精通Oracle10g PL/SQL编程》为读者提供了一个系统性的学习路径,从基础知识到高级应用,从具体技巧到最佳实践,涵盖了PL/SQL编程的方方面面。通过本书的学习,读者将能够有效地提高Oracle数据库编程的效率和...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    1. **基础语法**:PL/SQL是过程化SQL,它包含声明部分、执行部分和异常处理部分。声明部分用于定义变量、常量和游标;执行部分包含了SQL语句和流程控制结构,如循环、条件判断等;异常处理部分则用于捕获和处理运行...

    oracle实验三PL/SQL编程

    Oracle PL/SQL编程是Oracle数据库管理系统中的重要组成部分,它是一种过程化语言,允许开发者编写复杂的数据库应用程序。在本次实验中,我们将重点学习PL/SQL的基本语法、控制结构、复合数据类型以及异常处理技术。 ...

    精通pl/sql

    通过学习《精通Oracle.10g.Pl.SQL编程》,读者可以掌握编写高效、可靠的PL/SQL代码的技巧,提升数据库管理和应用开发的能力。书中可能还会包含大量的练习题和案例,以巩固学习效果并培养实际操作能力。Oracle 10g...

    oracle 9i pl/sql程序设计笔记

    通过上述对Oracle 9i PL/SQL程序设计笔记的总结,我们可以看到PL/SQL作为一种强大的数据库编程语言,提供了丰富的功能来支持数据处理、事务控制及业务逻辑的实现。掌握PL/SQL的不同块类型及其使用方法对于开发高效、...

    PL/SQL 核心基础代码

    本资源"PL/SQL 核心基础代码"是针对PL/SQL初学者的一个宝贵资料集合,包含了一系列核心基础部分的代码实例,旨在帮助学习者更好地理解和掌握PL/SQL编程。 在PL/SQL中,主要涉及以下几个关键知识点: 1. **声明变量...

    Oracle PL/SQL程序设计(第5版)(上下册)

    #### 一、PL/SQL编程基础 - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性...

    Oracle PL/SQL学习官方教材

    Oracle PL/SQL是一种强大的编程语言,它将SQL与过程编程语言的特性相结合,为数据库开发提供了丰富的功能。...通过深入学习这本教材,你将能够掌握Oracle PL/SQL编程,从而有效地设计和实现数据库解决方案。

    精通oracle 10g pl/sql编程

    本书不仅适用于PL/SQL编程的初学者,也适合有一定基础但希望建立更深层次理解的专业人士。 在Oracle 10g的环境下,PL/SQL编程是进行数据库开发的核心技能之一。PL/SQL结合了过程化编程语言的结构化特性以及SQL语句...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    oracle实验五 PL/SQL编程

    本次实验旨在使学习者深入了解PL/SQL编程的基础知识与实际应用。具体目标包括: 1. **掌握PL/SQL的数据类型和基本语法**:理解PL/SQL中不同数据类型的定义与使用方法,包括字符串类型等。 2. **熟悉控制结构与游标...

Global site tag (gtag.js) - Google Analytics