一、前言

SQL全称是“结构化查询语言(Structured Query Language)”,而PL/SQL是过程语言(Procedure Language),是对SQL的扩展。PL/SQL语言比任何其他程序设计语言(C、C++、java等)操作数据库的效率要高。

二、基本语法结构

declare --定义部分:包括定义变量、游标
/* 定义游标。有游标就肯定有打开游标、循环、关闭游标
* 小技巧:定义完游标后,游标需要的变量马上在后面定义,如定义ename,sal。
*/
cursor cemp is select ename,sal from emp;
pename emp.ename%type; --定义引用型变量(即引用emp表的ename列的类型,ename是什么类型pename也跟着是什么类型)
psal number; --定义一般变量
/* 定义记录型变量(以 _rec 结尾):代表一行数据。如:select * into emp_rec from emp where empno='2';
* 使用:emp_rec.ename,emp_rec.sal
*/
emp_rec emp%rowtype; begin
--打开游标
open cemp;
loop
fetch cemp into pename,psal; --获取一行数据
exit when cemp%notfound; --退出条件 dbms_output.put_line(pename||'的薪水是:'||psal); end loop;
--关闭游标
close cemp; exception
when... then...
when others... then... end;
/

1. 定义游标

cursor 游标名 [(参数名 数据类型[,参数名 数据类型]...)] is select 语句;
如:
定义:corsor cemp(dno number) is select ename from emp where deptno=dno;
打开:open cemp(2);

2. 循环(注意退出条件)

  • loop循环

      [<<label_name>>]
    LOOP
    [EXIT...WHEN...]
    [IF...EXIT]
    statement...
    END LOOP [label_name] 【语法说明】
    <<label_name>>:LOOP结构的标签,是可选项。
    LOOP:LOOP循环开始标志。
    statement:LOOP语句中循环执行的语句序列。
    END LOOP:LOOP循环结束标志,可以添加LOOP结构的标签。
  • for...loop循环

      [<<label_name>>]
    FOR index_name IN
    [ REVERSE ]
    lower_bound .. upper_bound
    LOOP
    statement...
    END LOOP [label_name]; 【语法说明】
    index_name:循环计数器,是一个变量,它可以得到当前的循环指数。需要注意的是,不能为其手工赋值。
    REVERSE:可选项,指定循环方式。默认的循环方式由下标(lower_bound)到上标(upper_bound)。使用该选项则从上标界到下标界。
    lower_bound:循环范围的下标界。
    upper_bound:循环范围的上标界。
    下标和上标之间的".."不能省略。 for example:
    1. for i in 1..10 loop
    2. select eno into empNo from emp;
    for n in empNo loop
  • while...loop循环

      [<<label_name>>]
    WHILE boolean_expression
    LOOP
    statement...
    END LOOP [label_name]; 【语法说明】
    boolean_expression:布尔表达式。
    statement:语句序列,当boolean_expression为TRUE时,该语句序列可获得执行权。

3. 条件判断

  • if...elsif

      IF 条件1 THEN
    statement...
    ELSIF 条件2 THEN
    statement...
    ELSE
    statement...
    END IF;
  • case

      CASE [selector]
      WHEN 表达式1 THEN 语句序列1;
      WHEN 表达式2 THEN 语句序列2;
      WHEN 表达式3 THEN 语句序列3;
      ……
      [ELSE 语句序列N];
    END CASE;

三、写PL/SQL思路

先把以下两个思路根据需求弄清楚再写sql,这样思路会比较清晰,程序也比较不容易出错

1. SQL语句

for example:
select ename,sal from emp;
游标 --> 循环 --> 退出条件(notfount or other)

2. 变量(初始值、如何得到需要的值)

根据需求确定需要什么变量。计算变量的值的时候,能用算术计算的就尽量用,少用sql,提高效率。如计算总工资,如果循环过程有各个职工的工资,累加即可,少用sum()。

四、属性

  • 游标属性:%found、%notfound、%isopen、%rowcount:影响的行数,即当前游标执行了多少行,并不是查询数据的总行数
  • 游标的限制:默认情况下,oracle只允许在同一个会话中,打开300个游标。

    修改游标数据限制:

    alter system set open_cursor=400 scope=both;

    scope的取值:both,memory,spfile。(spfile数据库需重启,修改配置文件;memory只在当前会话生效,both包括其他2个)

PL/SQL语言语法的更多相关文章

  1. PL/SQL基础语法入门

    先前安装了PL/SQL软件 PL/SQL全称为Procedural Language/SQL. PL/SQL也是一种程序语言,叫做过程化SQL语言,是Oracle数据库对SQL语句的扩展 打PL/SQ ...

  2. Oracle PL/SQL 语言(Procedural Language/SQL)

    Oracle PL/SQL 语言(Procedural Language/SQL)是结合了结构化查询与 Oracle 自身过程控制为一体的强大语言,PL/SQL 不但支持更多的数据类型,拥有自身的变量 ...

  3. PL/SQL语言的学习笔记

    一.PL/SQL简介1.什么是PL/SQL程序?(PL/SQL是对SQL语言的一个扩展,从而形成的一个语言) 2.PL/SQL语言的特点(操作Orcale数据库效率最高的就是PL/SQL语言,而不是C ...

  4. Oracle 的PL/SQL语言使用

    --PL/SQL语言(procedure language 过程化语言) --1.声明类型 declare k number; m ; --Character String buffer too sm ...

  5. 浅谈PL/SQL语言基础

    在前面的学习中,我们大部分接触的都是SQL语言,但是,在实现复杂操作的时候,SQL语言就无能为力了,这时候就需要引入新的语言,PL/SQL语言就是对SQL语言的扩展,可以实现存储过程,函数等的创建.下 ...

  6. PL/SQL基本语法

    *2.PL/SQL基本语法   1)匿名块   一段不能在数据库存储的PL/SQL. 基本结构如下:   DECLARE     //变量的声明定义区域(可省略)   BEGIN     //业务处理 ...

  7. PL/SQL语言基础

    PL/SQL语言基础 进行PL/SQL编程前,要打开输出set serveroutput on 1.创建一个匿名PL/SQL块,将下列字符输出到屏幕:"My PL/SQL Block Wor ...

  8. Oracle11g R2学习系列 之九 PL/SQL语言

    这是个重头戏,如果精通了PL/SQL,毫不夸张的说明精通了Oracle了.PL/SQL由以下三个部分组成(Definition,Manipulation,Control): DDL:数据定义语言,Cr ...

  9. PL/SQL常用语法及举例

    PLSQL语句 DECLARE 声明部分 BEGIN 程序编写,SQL语句 EXECPTION 处理异常 END; / 声明部分(DECLARE) SQL> set serveroutput o ...

随机推荐

  1. Windows系统自带的ODBC Data Sources的配置及使用

    一直不明白ODBC是个什么东东,虽然一次次碰到,却从没用过,看Wikipedia上的描述,可以访问各种数据库.Excel.CSV等,可以剥离数据库和操作系统依赖,简直神乎其神.不过这样的描述太抽象概括 ...

  2. SpringBoot @ConfigurationProperties详解

    文章目录 简介 添加依赖关系 一个简单的例子 属性嵌套 @ConfigurationProperties和@Bean 属性验证 属性转换 自定义Converter SpringBoot @Config ...

  3. 怎样实现App安装来源追踪

    众所周知,国内的应用商店存在一定的限制,开发者很难有效监测到App安装来源的精准数据.但在实际推广中,广告效果.用户行为.付费统计.邀请关系等不同渠道的指标却是衡量渠道价值的关键,对App的运营推广和 ...

  4. MongoDB学习(三)

    MongoDB条件操作符 $gt  > 大于 $lt   < 小于 $gte >= 大于等于 $lte  <= 小于等于 $ne  !=  不等于 条件操作符可用于查询语句中, ...

  5. VB中使用字典存储类对象

    2019独角兽企业重金招聘Python工程师标准>>> NODE类 Public pNext As NODE Public pPrev As NODE Public data As ...

  6. Codeforce 140C (贪心+优先队列)补题

    C. New Year Snowmen time limit per test2 seconds memory limit per test256 megabytes inputstandard in ...

  7. Makefile中的CFLAGS,LDFLAGS,LIBS

    CFLAGS:C编译器选项,而CXXFLAGS表示C++编译器的选项 1. CFLAGS参数 选项 说明 -c 用于把源码编译成.o对象文件,不进行链接过程 -o 用于连接生成可执行文件,在其后可以指 ...

  8. 06 __init__ 和 __new__的关系和不同

    一. 双下new 和 双下init 关系 首先从__new__(cls,a,b,c)的参数说说起,__new__方法的第一个参数是这个类,而其余的参数会在调用成功后全部传递给__init__方法初始化 ...

  9. Jmeter简单压测之服务器监控

    此篇为最近工作需要到内容,故现在做一个总结. 最近家里电脑坏了,等待会公司空闲在编写. 文章构思中,敬请期待.......

  10. 使用Jexus 容器化您的 Blazor 应用程序

    在本文中,我们将介绍如何将 Blazor 应用程序放入Jexus 容器以进行开发和部署.我们将使用 .NET Core  CLI,因此无论平台如何,使用的命令都将是相同的. Blazor 托管模型 B ...