热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

PL/SQL程序设计简介

??①PLSQL程序设计简介PLSQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,所以PLSQL代码可以对数据进行快速高效的处理在PLSQL中可以使用的SQL语句有:INSERT,UPDATE,DELETE,SELECT…INTO,COMMI


①PL/SQL 程序设计简介

PL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对ORACLE数据库进行访问。由于该语言集成于数据库服务器中,
所以PL/SQL代码可以对数据进行快速高效的处理

在PL/SQL中可以使用的SQL语句有:
INSERT,UPDATE,DELETE,SELECT …INTO,COMMIT,ROLLBACK,SAVEPOINT。
提示:在PL/SQL中只能用SQL语句中的DML 部分,不能用DDL 部分,如果要在PL/SQL中使用DDL(如CREATE  table  等)的话,只能以动态的方式来使用

②PL/SQL块结构和组成元素
PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分

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

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

③标识符
PL/SQL程序设计中的标识符定义与SQL 的标识符定义的要求相同。要求和限制有:
标识符名不能超过30字符;
第一个字符必须为字母;
不分大小写;
不能用’-‘(减号);
不能是SQL保留字。

提示:  一般不要把变量名声明与表中字段名完全一样,如果这样可能得到不正确的结果

建议的命名方法:
标识符         命名规则  例子
程序变量 V_name          V_name
程序常量 C_Name          C_company_name
游标变量 Name_cursor  Emp_cursor
异常标识 E_name          E_too_many
表类型         Name_table_type  Emp_record_type
表         Name_table  Emp
记录类型 Name_record  Emp_record
替代变量 P_name          P_sal
绑定变量 G_name          G_year_sal

④变量类型
除了CHAR、VARCHAR2、BINARY_INTEGER、NUMBER(p,s)、LONG、DATE、BOOLEAN、ROWID、ROWID这些
还有复合类型
ORACLE 在PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型---记录和表

1)记录类型
记录类型是把逻辑相关的数据作为一个单元存储起来,称作PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息。
定义记录类型语法如下:
TYPE record_type IS RECORD(
Field1 type1  [NOT NULL]  [:= exp1 ],
Field2 type2  [NOT NULL]  [:= exp2 ],
. . .   . . .
Fieldn typen  [NOT NULL]  [:= expn ] ) ;

例:
1 自定义记录类型

declare
  --定义一个记录类型
  type customer_type is record(
    v_cust_name varchar2(20),
    v_cust_id number(10));

  --声明自定义记录类型的变量
  v_customer_type customer_type;
begin
  v_customer_type.v_cust_name := '刘德华';
  v_customer_type.v_cust_id := 1001;
 
  dbms_output.put_line(v_customer_type.v_cust_name||','||v_customer_type.v_cust_id);
end;

2 自定义记录类型

declare
  --定义一个记录类型
  type emp_record is record(
    v_name varchar2(25),
    v_email varchar2(25),
    v_salary number(8, 2),
    v_job_id varchar2(10));
   
  --声明自定义记录类型的变量
  v_emp_record emp_record;
begin
  --通过 select ... into ... 语句为变量赋值
 select last_name, email, salary, job_id into v_emp_record
 from employees
 where employee_id = 186;
 
 -- 打印变量的值
 dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' || 
                                        v_emp_record.v_salary || ', ' ||  v_emp_record.v_job_id);
end;

4. 使用 %type 定义变量,动态的获取数据的声明类型

declare
  --定义一个记录类型
  type emp_record is record(
    v_name employees.last_name%type,
    v_email employees.email%type,
    v_salary employees.salary%type,
    v_job_id employees.job_id%type);
   
  --声明自定义记录类型的变量
  v_emp_record emp_record;
begin
  --通过 select ... into ... 语句为变量赋值
 select last_name, email, salary, job_id into v_emp_record
 from employees
 where employee_id = 186;
 
 -- 打印变量的值
 dbms_output.put_line(v_emp_record.v_name || ', ' || v_emp_record.v_email || ', ' || 
                                        v_emp_record.v_salary || ', ' ||  v_emp_record.v_job_id);
end;


5. 使用 %rowtype

declare
--声明一个记录类型的变量
  v_emp_record employees%rowtype;
begin
  --通过 select ... into ... 语句为变量赋值
 select * into v_emp_record
 from employees
 where employee_id = 186;
 
 -- 打印变量的值
 dbms_output.put_line(v_emp_record.last_name || ', ' || v_emp_record.email || ', ' || 
                                        v_emp_record.salary || ', ' ||  v_emp_record.job_id  || ', ' || 
                                        v_emp_record.hire_date);
end;


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

语法说明如下:
--table_name  创建的表类型名称。
--IS TABLE  表示创建的是表类型。
--datatype  可以是任何合法的PL/SQL数据类型,例如varchar2。
--INDEX BY BINARY_INTEGER  指定系统创建一个主键索引,用于引用表类型变量中的特定行。

declare

type my_record_type is record(
   v_id varchar2(32),
   v_name varchar2(100)
);

type my_table_type is table of my_record_type
index by BINARY_INTEGER;

begin
 
dbms_output.put_line('11111111111111');
end;

方法 描述
EXISTS(n):Return TRUE if the nth element in a PL/SQL table exists;
COUNT:Returns the number of elements that a PL/SQL table currently contains;
FIRST\LAST:Return the first and last (smallest and lastest) index numbers in a PL/SQL table. Returns NULL if the PL/SQL table is empty.
PRIOR(n):Returns the index number that precedes index n in a PL/SQL table;
NEXT(N):Returns the index number that succeeds index n in a PL/SQL table;
TRIM:TRIM removes one element from the end of a PL/SQL table.
TRIM(n):removes n element from the end of a PL/SQL table.
DELETE:DELETE removes all elements from a PL/SQL table.
DELETE(n):removes the nth elements from a PL/SQL table.
DELETE(m, n):removes all elements in the range m to n from a PL/SQL table.

⑤变量赋值
variable  := expression;
variable 是一个PL/SQL变量, expression 是一个PL/SQL 表达式.

⑥字符及数字运算特点
空&#20540;加数字仍是空&#20540;:NULL &#43; <数字> = NULL
空&#20540;加(连接)字符,结果为字符:NULL || <字符串> = <字符串>

⑦可转换的类型赋&#20540;
CHAR 转换为NUMBER:
使用TO_NUMBER 函数来完成字符到数字的转换,如:
v_total  := TO_NUMBER(‘100.0’) &#43; 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 程序,一般系统自动将程序头部的注释去掉。
只有在PROCEDURE 之后的注释才被保留;另外程序中的空行也自动被去掉。



推荐阅读
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文介绍了如何使用 PostgreSQL 的 `UPDATE ... FROM` 语法,通过映射表实现对多行记录进行高效的批量更新。这种方法不仅适用于单列更新,还支持多列的同时更新。 ... [详细]
  • 本文介绍了如何在 DB2 环境中创建和删除数据库编目。创建编目是连接新数据库的必要步骤,涉及获取数据库连接信息、使用命令行工具进行配置,并验证连接的有效性。删除编目则用于移除不再需要的数据库连接。 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 创建第一个 MUI 移动应用项目
    本文将详细介绍如何使用 HBuilder 创建并运行一个基于 MUI 框架的移动应用项目。我们将逐步引导您完成项目的搭建、代码编写以及真机调试,帮助您快速入门移动应用开发。 ... [详细]
  • 梦幻西游挖图奇遇:70级项链意外触发晶清诀,3000W轻松到手
    在梦幻西游中,挖图是一项备受欢迎的活动,无论是小宝图还是高级藏宝图,都吸引了大量玩家参与。通常情况下,小宝图的数量保证了稳定的收益,但特技装备的出现往往能带来意想不到的惊喜。本文讲述了一位玩家通过挖图获得70级晶清项链的故事,最终实现了3000W的游戏币逆袭。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
author-avatar
崔维安
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有