PL/SQL之基础

一 SQL与PL/SQL

1 PL/SQL概念

PL/SQL 是一种高级数据库程序设计语言,该语言 专门用于在各种环境下对 ORACLE 数据库进行访问 。由于该语言 集成于数据库服务器中 所以 PL/SQL 代码可以对数据进行快速高效的处理。
PL/SQL是对 SQL 语言存储过程语言的扩展 从 ORACLE6 以后, ORACLE 的 RDBMS 附带了 PL/SQL 。它现在已经成为一种 过程处理语言 ,简称 PL/SQL 。目前的 PL/SQL 包括两部分,一部分是数据库引擎部分;另一部分是可嵌入到许多产品(如 C 语言, JAVA 语言等)工具中的独立 引擎。可以将这两部分称为:数据库 PL/SQL 和工具PL/SQL 。两者的编程非常相似。都具有编程结构、语法和逻辑机制。工具 PL/SQL 另外还增加了用于支持工具(如 ORACLE Forms )的句法,如:在窗体上设置按钮等。

2 PL/SQL的好处

① 有利于客户端/服务器环境应用的运行
对于客户服务器环境来说,真正的瓶颈是网络上。无论网络多快,只要客户端与服务器进行大量的数据交换。应用运行的效率自然就回受到影响。如果使用 PL/SQL 进行编程, 将这种具有大量数据处理的应用放在服务器端来执行。自然就省去了数据在网上的传输时间。
② 适合于客户环境
PL/SQL由于分为数据库 PL/SQL 部分和工具 PL/SQL 。对于客户端来说, PL/SQL 可以嵌套到相应的工具中,客户端程序可以执行本地包含PL/SQL 部分,也可以向服务发 SQL 命令或激活服务器端的 PL/SQL 程序运行

3 PL/SQL可用的SQL语句

PL/SQL 是 ORACLE 系统的核心语言,现在 ORACLE 的许多部件都是由 PL/SQL 写成 。在 PL/SQL 中 可以使用的 SQL 语句有:INSERT UPDATE DELETE SELECT INTO COMMIT ROLLBACK SAVEPOINT 。
提示:在PL/SQL 中只能用 SQL 语句中的 DML 部分不能用 DDL 部分,如果要在 PL/SQL 中使用 DDL( 如CREATE table 等 的话,只能以动态的方式来使用。
① ORACLE 的 PL/SQL 组件在对 PL/SQL 程序进行解释时,同时对在其所使用的表名、列名及数据类型进行检查。
② PL/SQL 可以在 SQL*PLUS 中使用。
③ PL/SQL 可以在高级语言中使用。
④ PL/SQL 可以 在 ORACLE 的 开发工具中使用。
⑤ 其它开发工具也可以调用 PL/SQL 编写的过程和函数,如 Power Builder 等都可以调用服务器端的PL/SQL 过程。

4 运行PL/SQL程序

PL/SQL 程序的运行是通过 ORACLE 中的一个引擎来进行的。这个引擎可能在 ORACLE 的服务器端,也可能在 ORACLE 应用开发的客户端引擎执行 PL/SQL 中的过程性语句,然后将 SQL 语句发送给数据库服务器来执行。再将结果返回给执行端。

二 PL/SQL块结构和组成元素

1 PL/SQL块结构
PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分
PL/SQL块的结构如下:

DECLARE
/*声明部分 : 在此声明 PL/SQL 用到的变量 类型及游标,以及局部的存储过程和函数*/
BEGIN
/* 执行部分 : 过程及 SQL 语句 , 即程序的主要部分*/
EXCEPTION
/* 执行异常部分 : 错误处理*/
END

PL/SQL块分为三类:
(1)无名块:动态构造,只执行一次
(2)子程序 :存储在数据库中的 存储过程、函数 及包等。当在数据库上建立好后可以在其它程序中调用它们
(3)触发器 :当数据库发生操作时,会触发一些事件,从而自动执行相应的程序。

2 PL/SQL结构
(1)PL/SQL 块中可以包含子块;
(2)子块可以位于 PL/SQL 中的任何部分;
(3)子块也即 PL/SQL 中的一条命令;

3 标识符
PL/SQL程序设计中的标识符定义与 SQL 的标识符定义的要求相同。要求和限制有:
(1) 标识符名不能超过 30 字符;
(2) 第一个字符必须为字母;
(3) 不分大小 写;
(4) 不能用 减号
(5) 不能是 SQL 保留字。
提示:一般不要把变量名声明与表中字段名完全一样 如果这样可能得到不正确的结果
变量命名在 PL/SQL 中有特别的讲究,建议在系统的设计阶段就要求所有编程人员共同遵守一定的要求,使得整个系统的文档在规范上达到 要求。下面是 建议的命名方法

4 PL/SQL变量类型
(1)变量类型


(2)记录类型
记录类型是把逻辑相关 的数据作为一个单元存储起来 称作 PL/S QL RECORD 的域 ( FIELD),其作用是存放互不相同但逻辑相关的信息
定义记录类型语法如下

TYPE record_type IS RECORD(Field1 type1 [NOT NULL] [:= exp1 ],Field2 type2 [NOT NULL] [:= exp2 ],. . . . .Fieldn typen [NOT NULL] [:= expn ] )

案例:

提示

  1. DBMS_ OUTPUT.PUT_LINE 过程的功能类似于 Java 中的 System.out.println() 直接将输出结果送到
    标准输出中 .
  2. 在使用上述过程之前必须将 SQL * PLUS 的环境参数 SERVEROUTPUT 设置为 ON, 否则将看不到输出结果 set serveroutput on可以用 SELECT 语句对记录变量进行赋值 只要保证记录字段与查询结果列表中的字段相配即可 。
    (2)使用%Type
    定义一个变量,其数据类型与已经定义的某个数据变量类型相同,或者与数据库表的某个列的数据类型相同,这时可以使用%TYPE
    使用%TYPE 特性的优点在于:
    ① 所引用的数据库列的数据类型可以不必知道
    ② 所引用的数据库列的数据类型可以实时改变

    (3)使用%ROWTYPE
    PL/SQL提供 %ROWTYPE 操作符 , 返回一个记录类型 , 其数据类型和数据库表的数据结构相一致
    使用%ROWTYPE 特性的优点在于:
    ① 所引用的数据库中列的个数和数据类型可以不必知道;
    ① 所引用的数据库中列的个数和数据类型可以实时改变。

    (4)PL/SQL表
    PL/SQL程序可使用嵌套表类型创建具有一个或多个列和无限行的变量 , 这很像数据库中的表 . 声明嵌套表类型的一般语法如下 :
TYPE type_name IS TABLE OFdatatype | {variable | table.column} % type | table%rowtype}



说明

  1. 在使用嵌套表之前必须先使用该集合的构造器初始化它 . PL/SQL 自动提供一个带有相同名字的构造器作为集合类型 .
  2. 嵌套表可以有任意数量的行 表的大小在必要时可动态地增加或减少 : extend(x) 方法添加 x 个空元素到集合末尾 ; trim(x) 方法为去掉集合末尾的 x 个元素
    (5)变量赋值
    在PL/SQL 编程中,变量赋值是一个值得注意的地方,它的语法如下:
    variable := expression
    variable 是一个 PL/SQL 变量 , expression 是一个 PL/SQL 表达式
    ① 字符及数字运算特点
    空值加数字仍是空值:NULL + < 数字 > = NULL
    空值加(连接)字符,结果为字符:NULL || < 字符串 > = < 字符串
    ② Boolean赋值
    只有true、false、nul三个值
    ③ 数据库赋值
    数据库赋值是 通过 SELECT 语句来完成的 ,每次执行 SELECT 语句就赋值一次, 一般要求被赋值的变量与SELECT 中的列名要一一对应 。不能把select语句中的列值赋给布尔变量。
    如:
DECLAREemp_id emp.empno%TYPE :=7788;emp_name emp.ename%TYPE;wages emp.sal%TYPE;
BEGINSELECT ename, NVL(sal,0) + NVL(comm,0) INTO emp_name, wagesFROM emp WHERE empno = emp_id;DBMS_OUTPUT.PUT_LINE(emp_name||’name||’--------‘||to_char(wages));
END;

④ 可转换的类型赋值
 CHAR 转换为 NUMBER使用TO_NUMBER 函数来完成字符到数字的转换,如:
v_total := TO_NUMBER(‘100.0’) + sal;
 NUMBER 转换为 CHAR使用 TO_CHAR 函数可以实现数字到字符的转换,如:
v_comm := TO_CHAR(‘123.45’) || ’元 ’
 字符转换为日期:
使用TO_DATE 函数可以实现 字符到日期的转换,如:
v_date := TO_DATE(‘2001.07.03’,‘yyyy.mm.dd’);
 日期转换为字符
使用TO_CHAR 函数可以实现日期到字符的转换,如:
v_to_day := TO_CHAR(SYSDATE, ‘yyyy.mm.dd hh24:mi:ss’) ;
⑤ 变量作用范围及可见性
在PL/SQL 编程中,如果在变量的定义上没有做到统一的话,可能会隐藏一些危险的错误,这样的原因主要是变量的作用范围所致。与其它高级语言类似, PL/SQL 的变量作用范围特点是:
 变量的作用范围是在你所引用的程序单元(块、子程序、包)内。即从声明变量开始到 该块的结束。
 一个变量(标识)只能在你所引用的块内是可见的。
 当一个变量超出了作用范围, PL/SQL 引擎就释放用来存放该变量的空间(因为它可能不用了)。
 在子块中重新定义该变量后,它的作用仅在该块内。
⑥ 注释
使用“–”进行单行注释
使用“/* */”进行单行和多行注释
⑦ 案例显示

DECLAREv_ename VARCHAR2(20) := ‘Bill’;v_sal NUMBER(7,2) :=1234.56;v_deptno NUMBER(2) := 10;v_empno NUMBER(4) := 8888;
BEGININSERT INTO emp ( empno, ename, JOB, sal, deptno , hiredate )VALUES ( v_empno, v_ename, ‘Manager’, v_sal, v_deptno,TO_DATE(’1954.06.09’,’yyyy.mm.dd’) );COMMIT;
END;

PL/SQL之块结构和组成元素相关推荐

  1. Oracle数据库第二课——使用PL/SQL进行初步编程,了解PL/SQL的相关知识

    知识点:了解PL/SQL的编程的基础:了解PL/SQL的注释:掌握PL/SQL的块结构:掌握PL/SQL的数据类型.运算符.字符集.标识符:掌握PL/SQL语句块的书写.变量的声明和赋值 1.PL/S ...

  2. PostgreSQL Oracle 兼容性之 - PL/SQL FORALL, BULK COLLECT

    Oracle PL/SQL 开发的童鞋,一定对O家的bulk批量处理的性能很是赞赏吧. 但是PostgreSQL用户请不要垂涎,作为学院派和工业界的一颗璀璨明珠. 开源数据库PostgreSQL,也有 ...

  3. PL/SQL详细介绍

    PL/SQL笔记 PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事务控制语句(COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DD ...

  4. oracle pl/sql 基础

    PL/SQL笔记 PL/SQL块中只能直接嵌入SELECT,DML(INSERT,UPDATE,DELETE)以及事务控制语句(COMMIT,ROLLBACK,SAVEPOINT),而不能直接嵌入DD ...

  5. Oracle PL/SQL 编程手册(SQL大全)

    一.SQLPLUS 1引言 SQL命令 以下17个是作为语句开头的关键字: alterdroprevoke auditgrantrollback* commit*insert ...

  6. PL/SQL基础(1):语法

    本篇是 Oracle基础小结 系列之一. 本篇目录 1.什么是PL/SQL? 2.PL/SQL基本结构 3.PL/SQL符号定义 4.PL/SQL数据类型 5.PL/SQL条件句法 6.PL/SQL循 ...

  7. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

  8. ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORAC ...

  9. 一、PL/SQL 块结构和组成元素

    PLSQL 一.PL/SQL 程序设计简介 二.PL/SQL 块结构和组成元素 PL/SQL 块 PL/SQL 块的结构如下: PL/SQL 块可以分为三类: PL/SQL 结构 标识符 PL/SQL ...

最新文章

  1. 南京超过广州!4 月程序员工资统计出炉,平均 14596 元
  2. 何为 Serverless 架构模式?这 5 大场景来告诉你!
  3. 内部同步 外部同步 java_如何用匿名内部类实现 Java 同步回调
  4. 没使用Spring Cloud的版本管理导致Eureka服务无法注册到Eureka服务注册中心
  5. Java项目:Springboot图书馆图书借阅管理系统
  6. 网络限速软件测试大乐,宽带测速谁靠谱?网速测试软件大对比
  7. 龙芯2F笔记本安装gentoo系统
  8. php 图片合成,PHP 实现图片合成(两张合并一张)
  9. HDOJ1233 还是畅通工程(kru)
  10. 『踩坑』pyechart绘图不出图的解决方案
  11. 计算机网络的发展过程大致可以分为几个,计算机网络发展过程分几个阶段
  12. 干货!我开发 Android 是如何界面设计的
  13. JS字符串转数组和数组转字符串
  14. Mac电脑双击打不开文件夹
  15. 基带0day漏洞可攻击数百万部华为手机
  16. vero visi 2021中文版
  17. 涨粉写作经验分享(一) - 写作技巧
  18. 怎么把mp4转换成mp3音频
  19. 高效能人士的执行四原则(五)——原则4:建立规律问责制
  20. c语言100以内最大能被17整除,求100之内自然数中最大的能被17整除的数

热门文章

  1. 百度员工离职总结:我永远不会成为一个好员工
  2. java时间戳防重放_API防重放机制
  3. html5 围住神经猫,围住神经猫4步攻略 玩法技巧详解
  4. AOC AG273QXP 评测
  5. 2022年全球与中国微型光谱仪市场现状及未来发展趋势
  6. Ubuntu安装后需要做的事
  7. 汽车行业工作汇报年终总结PPT模板
  8. javawebJAVAJSP客户关系管理系统jsp会员信息管理系统jsp客户管理系统jsp客户登记系统
  9. Radon变换理论介绍与matlab实现--经验交流
  10. 群体智能优化算法学习