PUSQL学习1——PUSQL 基础

  • 带着问题学习
    了解PL/SQL块的基本结构以及PL/SQL 块的分类;
    学会在PL/SQL块中定义和使用变量;
    学会在PL/SQL块中编写可执行语句;
    了解编写PL/SQL代码的指导方针;
    了解Oracle 1Og的性特征—新数据类型BINARY_FLOAT和BINARY_DOUBLE,以及指定字符串文本的新方法.

PL/SQL块简介

块 (Block)是PL/SQL的基本程序单元,编写PL/SQL程序实际就是编写PL/SQL块。要 完成简单的应用功能。可能只需要写一个简单的PL/SQL块;如果要实现复杂的应用功能,就要在PL/SQL块中嵌套其他的PL/SQL块;编写PL/SQL应用模块,块的嵌套层次没有限制。

PL/SQL块结构

由三部分组成,声明部分(DECLARE/declare),执行部分(BEGIN-END/begin-end),异常部分(EXCEPTION/exception)。
- 声明部分:用于定义常量、变量、游标、例外(异常)、复杂数据类型等;
- 执行部分:用于实现应用模块功能,包含了要执行的SQL语句和PL/SQL语句
- 例外部分:用于对于执行部分出现的例外进行处理

格式
-- 声明部分
declare 
  -- 声明变量、常量、例外(异常)、游标、复杂数据类型
  -- 声明时,需要确定数据类型的长度
begin
  -- 执行SQL语句或PL/SQL语句
exception
  -- 处理执行过程中出现的例外(异常)
end;  -- 块结束标记

注意:
declare(声明部分)和exception(例外/异常部分)是可选的,begin(执行部分)是不需要有的,块最终以end结束,end后面要加“;”号

注意,当使用dbms_output包输出数据或准息时,必须将SQL*Plus的环境变量serveroutput设置为on。

PL/SQL块分类

根据需要实现的应用模块功能,可以将PL/SQL块划分为匿名块、命名块、子程序和触发器等四类。

  • 匿名块:
    匿名块是指没有名称的PL/SQL块,匿名块既可以内嵌到应用程序中,也可以在交互式环境中直接使用
declare
  e_no number := &eno;
  e_name varchar2(20) ;
begin
  select ename into e_name from emp 
  where empno = e_no;
  dbms_output.put_line(e_name);
exception
  when no_data_found then
    dbms_output.put_line('此员工不存在');
end;

上述例子中,因为直接通过declare定义的块,所以是一个匿名块

  • 命名块:
    命名块是指具有特定名称标识的PL/SQL块,命名块与匿名块非常类似,只不过在PL/SQL块前使用<<>>加以标记。当使用嵌套块时,为了区分多级嵌套层次关系,可以使用命名块加以区分。
-- 这里用的是PL/SQL Developer进行测试,所以需要在命名块外部添加一个匿名块,有网友说在SQLPlus中,命名块可以直接写,不需要再匿名块中,有待实验
begin
  <<oute>>
  declare
    e_name varchar2(20);
  begin
    <<inne>>
    begin
      select ename into e_name from emp where empno = &eno;
    end;
    dbms_output.put_line(e_name);
  end;
end;
  • 子程序
    子程序包括过程、函数和包,当开发PL/SQL子程序时,既可以开发客户端的子程序,也可以开发服务器端的子程序,客户端子程序主要用在Developer中,而服务器端子程序可以用在任意应用程序中。

1.过程:过程用于执行特定操作,当建立过程时,既可以指定输入参数(in), 也可以制定输出参数(out)。通过在过程中使用输入参数,可以将应用环境的数据传递到执行部分,通过使用输出参数,可以将执行部分的数据传递到应用环境。可以使用create or replace procedure命令创建过程。

格式:
create or replace procedure 过程名(参数列表) is
begin
sql语句;
end;

-- 创建一个独立的过程
create or replace procedure update_sal(esal in emp.sal%type, eno in number) is
begin
  update emp set sal = esal where empno = eno;
  commit;
end;
-- 执行这个过程方式一
begin
  update_sal(800, 7369);
end;
-- 执行这个过程方式二
SQL> exec update_sal(800, 7369);
-- 执行这个过程方式三
SQL> call update_sal(800, 7369);


注意:
1.过程的形式参数不能定义数据类型的长度
2.过程的形式参数中可以给定in或out表示这个参数是输入参数,还是输出参数,输出参数表示语句执行结束后需要用同数据类型的值接收
3.如果不写in或out,默认为in,即输入参数

2.函数:
函数用于返回特定数据,当建立函数时,在函数头部必须包含return子句,而函数体内必须包含return语句返回数据,可通过create or replace function命令创建函数

格式:
create or replace function 方法名(参数) return 数据类型 is 参数名 数据类型;
begin
sql语句;
return 参数名;
end;

-- 创建一个独立的函数
create or replace function annual_income(e_no emp.empno%type)
  return number is sum_sal number;
begin
  select sal+nvl(comm, 0) into sum_sal from emp where empno = e_no;
  return sum_sal;
end;
-- 执行函数
declare
  a number;
begin
 a := annual_income(7369);
 dbms_output.put_line(a);
end;

3.包:
包用于逻辑组合相关的过程和函数, 它由包规范(包头)和包体两部分组成,相当于Java中的借口和实现类。包规范用于定义公用的常量、变量、过程和函数,可以使用create or replace package创建包

-- 包头:
create or replace package 包名 is
  function find(参数列表) return 返回值类型;
  procedure 过程名(参数列表) ;
end;

create or replace package test is
  function find(a number) return number;
  procedure find2(b in number, c out number);
end;

包头(包规范)只包含了过程和函数的说明,而没有过程和函数的实现代码。包体用于实现包头(包规范)中的过程和函数,使用create or replace package body创建

-- 包体
create or replace package body 包体名 is 
  function 函数名(参数列表) return 返回值类型 is 返回值列表 ;
    begin 
      函数的方法体;
      return 返回值;
    end;
  procedure 过程名(参数列表) is 
    begin 
      过程方法体;
    end;
end;

create or replace package body test is
  function find(a number) return number is e_sal number ;
    begin
      select sal into e_sal from emp where empno = a;
      return e_sal;
    end;
  procedure find2(b in number, c out number) is 
    begin
      select sal into c from emp where empno = b ;
    end;
end;

当调用包的过程和函数时,在过程和函数名之前必须带上包名座位前缀(包名.子程序名),如果访问其他方案的包,还必须加上方案名作为前缀(方案名.包名.子程序名)

declare 
  num number;
begin 
  num := test.find(7369);
end;

定义并使用变量

编写PL/SQL程序时,若临时存储数值,必须要定义变量和常量;若在应用环境和子程序之间传递数据,必须要为子程序指定参数。在PL/SQL程序中定义变量、常量和参数时,必须指定数据类型。PL/SQL中有四种数据类型:标量类型(Scalar)、复合类型(Composite)、参照类型(Reference)和LOB(Large Object)类型。
这里写图片描述

标量变量

指只能存放单个数值的变量。

  • 常用标量类型
    1.varchar2(n)
    用于定义可变长度的字符串,其中n指定字符串的最大长度,其最大值为32767,当时用此数据类型时,必须指定长度
    2.char(n)
    存储固定长度的字符串,n指定字符串的最大长度,最大值为32767字节,如果没有指定n,默认为1
    3.number(p,s)
    存储固定长度的证书和浮点数,p表示精度,指定数字的总位数,s表示标度,指定小数点后的数字位数
    4.date
    存储时间和日期数据,长度为固定的7个字节,当给date变量赋值时,数据需与日期格式和日期语言匹配
    5.timestamp
    是Oracle9i新增的数据类型,存储日期和时间数据,与date使用方法相同,在显示日期时,还会显示时间和上下午标记
    6.long和long raw
    long用于定义变长字符串,最大长度为32760字节;long raw用于定义变长的二进制数据,最大长度32760字节
    7.boolean
    存储布尔变量,其值为true、false、null;为PL/SQL数据类型,表列不能采用boolean数据类型
    8.binary_integer
    定义整数,数值范围-2147483647~2147483647之间,在Oracle9i之前,当在PL/SQL块中定义PL/SQL表时,必须使用该数据类型作为下标的数据类型,为PL/SQL数据类型,表列不能采用boolean数据类型
    9.binary_float和binary double
    是Oracle 10g 新增的数据类型,主要用于高速的科学计算。
  • 定义标量变量
    如果要使用变量,需要在声明中定义变量
    1.语法
变量名 [constant] 数据类型 [not null] [:= | default 初始值]
constant可选,如果定义常量,则必须有这个标识
not null可选,规定数据是否可为null
:= 赋值符号、
defalut 定义数据的初始值,如果为常量,则必须定义

这里写图片描述
2.%type属性
定义变量时,可以使用%type属性确定变量的数据类型

sal emp.sal%type; -- 这就表示定义了一个名为sal,数据类型为emp表中的sal字段的数据类型的变量

这样定义变量的好处在于不容易出现数据类型错误
- 复合变量
存放多个值得变量,必须使用PL/SQL的复合数据类型定义;包括PL/SQL记录、PL/SQL表、嵌套表以及VARRAY等四种复合数据类型。
1.PL/SQL记录
需要在定义部分定义记录数和记录变量,当使用记录成员时,必须要加记录变量作为前缀(记录变量.记录成员)

-- 格式:
declare 
  type 复合类型名称 is record(
    参数列表
  );
begin
  执行体;
end;

-- 例子
declare 
  type emp_no_name is record(
       eno emp.empno%type,
       enam emp.ename%type);
  emp_no_name_test emp_no_name;
begin
  select empno, ename into emp_no_name_test from emp where empno = 7369;
  dbms_output.put_line(emp_no_name_test.eno || ' ' || emp_no_name_test.enam);
end;

2.PL/SQL表
类似于Java中的数组,但PL/SQL表的下标可以为负值,元素个数没有限制,需要先声明。

-- 格式:
declare
  type 表名 is table of 数据类型
    index by binary_integer;
  变量名 数据类型;
begin
  执行语句;
end;
-- 例子:
declare
  type emp_table is table of emp.sal%type
    index by binary_integer;
  emp_table_test emp_table;
begin
  select sal into emp_table_test(-1) from emp where empno = 7369;
  dbms_output.put_line(emp_table_test(-1));
end;
作  者:钱慎一,张素智 编 出 版 社:中国水利水电出版社 ISBN:9787508468303 出版时间:2009-09-01 版  次:1 页  数:468 装  帧:平装 开  本:16开 所属分类:图书 > 计算机与互联网 > 数据库 目录 前言 第1章 Oracle数据库概述 1.1 Oracle数据库产品结构及组成 1.1.1 企业版 1.1.2 标准版 1.1.3 标准版 1.1.4 个人版 1.2 数据库基本术语 1.2.1 数据库 1.2.2 数据库管理系统 1.2.3 数据库系统 1.2.4 数据库模式 1.2.5 数据模型 1.2.6 数据完整性约束 1.2.7 联机事务处理和联机分析处理 1.2.8 数据仓库 1.3 Oracle基本术语 1.3.1 数据字典 1.3.2 数据文件 1.3.3 控制文件 1.3.4 日志文件 1.3.5 表空间 1.3.6 段 1.3.7 区 1.3.8 数据块 1.4 Oracle 11g的新特性 1.4.1 数据库管理部分 1.4.2 PL/SQL部分 1.4.3 其他部分 第2章 Oracle在Windows平台上的安装与配置 2.1 Oracle通用安装器 2.2 Oracle数据库软件的安装 2.3 Oracle数据库软件的卸载 2.3.1 停止所有的Oracle服务 2.3.2 用OUI卸载所有的Oracle组件 2.3.3 手动删除Oracle遗留的成分 2.4 Oracle的应用结构 2.4.1 单磁盘独立主机结构 2.4..2 多磁盘独立主机结构 2.4.3 多数据库独立主机结构 2.4.4 C/S结构 2.4.5 分布式结构 2.5 Oracle网络与防火墙 2.5.1 Oracle网络服务 2.5.2 配置Oracle网络环境 2.5.3 Oracle防火墙 第3章 SQL语言基础 3.1 SQL概述 3.1.1 SQL语言的功能 3.1.2 SQL的特点 3.1.3 SQL语句的编写规则 3.2 数据定义 3.2.1 CREATE 3.2.2 DROP 3.2.3 ALTER 3.3 数据查询 3.3.1 简单查询 3.3.2 WHERE子句 3.3.3 ORDER BY子句 3.3.4 GROUPBY子句 3.3.5 HAVING子句 3.3.6 多表连接查询 3.3.7 集合操作 3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2 REVOKE语句 3.6 Oracle常用函数 3.6.1 字符类函数 3.6.2 数字类函数 3.6.3 日期类函数 3.6.4 转换类函数 3.6.5 聚集类函数 第4章 Oracle PL/SQL语言及编程 4.1 PL/SQL简介 4.1.1 PL/SQL的基本结构 4.1.2 PUSQL注释 4.1.3 PL/SQL字符集 4.1.4 PL/SQL数据类型 4.1.5 PIJSQL变量和常量 4.1.6 PLSQL语句控制结构 4.1.7 PL/SQL表达式 4.2 PL/SQL的游标 4.2.1 基本原理 4.2.2 显式游标 4.2.3 隐式游标 4.2.4 游标属性 4.2.5 游标变量 4.3 过程 4.3.1 创建过程 4.3.2 调用过程 4.3.3 删除过程 4.3.4 过程的参数类型及传递 4.4 函数 4.4.1 创建函数 4.4.2 调用函数 4.4.3 删除函数 4.5 程序包 4.5.1 基本原理 4.5.2 创建包 4.5.3 调用包 4.5.4 删除包 4.6 触发器 4.6.1 触发器的基本原理 4.6.2 创建触发器 4.6.3 执行触发器 4.6.4 删除触发器 第5章 熟悉SQL*Plus-Oracle数据库环境 5.1 进入和退出SQL*Plus环境 5.1.1 启动SQL*Plus 5.1.2 创建SQL*Plus快捷方式 5.1.3 退出SQL*Plus环境 5.2 SQL*Plus编辑器的编辑命令 5.2.1 编辑命令 5.2.2 保存命令 5.2.3 加入注释 5.2.4 运行命令 5.2.5 编写交互命令 5.2.6 使用绑定变量 5.2.7 跟踪语句 5.3 设置SQL*Plus环境 5.3.1 SHOW命令 5.3.2 SET命令 5.4 SQL*Plus环境介绍 5.4.1 存储SQL*Plus环境 5.4.2 假脱机输出 5.4.3 联机帮助 5.5 使用SQL*Plus格式化查询结果 5.5.1 格式化列 5.5.2 定义页与报告的标题和维数 5.5.3 存储和打印结果 第6章 Oracle的基本操作 6.1 Oracle的启动与关闭 6.1.1 启动Oracle数据库 6.1.2 关闭Oracle数据库 6.2 表的创建与改进 6.2.1 表的基本概念 6.2.2 表结构设计 6.2.3 表的创建 6.2.4 修改表结构 6.3 索引 6.3.1 索引的概念 6.3.2 创建索引 6.3.3 删除索引 6.4 视图 6.4.1 视图的概念 6.4.2 创建视图 6.4.3 视图更改 6.4.4 删除视图 6.5 数据操纵与数据查询 6.5.1 复制原表插入记录 6.5.2 使用视图 6.5.3 使用PL/SQL语言 6.5.4 数据查询 第7章 Oracle数据库管理操作 7.1 学会使用视图 7.1.1 增加安全性 7.1.2 隐藏数据的复杂性 7.1.3 实现命名简洁性和易读性 7.1.4 实现更改灵活性 7.2 实现记录的唯一性 7.2.1 用键实现 7.2.2 创建唯一索引 7.2.3 使用序列实现 7.3 实现数据的完整性 7.3.1 域完整性 7.3.2 实体完整性 7.3.3 引用完整性 7.3.4 存储过程检查 7.3.5 使用触发器 7.4 避免更改引起的大量改动 7.4.1 使用视图 7.4.2 使用同义名 7.4.3 使用光标 第8章 数据库用户管理 8.1 授予权限 8.1.1 直接授权 8.1.2 授权角色 8.1.3 使用OEM的“安全管理”创建 角色 8.1.4 使用ALTERUSER语句修改 用户的默认角色 8.1.5 使用SET ROLE控制角色使用 8.2 回收权限 8.2.1 逐一回收 8.2.2 删除角色 8.2.3 删除数据库对象 8.2.4 删除用户 8.3 不同用户权限管理 8.4 管理对数据库对象的访问 8.4.1 使用用户口令 8.4.2 使用权限控制 8.4.3 使用数据库链接 8.4.4 使用配置文件 第9章 数据库空间管理 9.1 建立数据库时的空间设计 9.1.1 指定system表空间初值 9.1.2 设置其他表空间初值 9.2 在空间充足时的管理 9.2.1 使用数据字典动态监视 9.2.2 向表空间增加数据文件 9.3 解决空间不足的方法 9.3.1 增加数据文件大小 9.3.2 创建新表空间 9.3.3 动态增加表空间 9.3.4 三种方法的区别与比较 9.4 合理利用存储空间 9.4.1 采用正确的数据类型 9.4.2 存储参数的正确设置 9.4.3 定期回收无用表空间 9.4.4 归档历史表空间 第10章 备份与恢复机制 10.1 备份与恢复的方法 10.2 使用数据泵进行逻辑备份和恢复 10.2.1 使用expdp导出数据 10.2.2 使用impdp导入数据 10.3 使用OEM中进行备份与恢复 10.3.1 通过导出文件来备份 10.3.2 通过导入来恢复 10.4 脱机备份与恢复 10.4.1 脱机备份 10.4.2 脱机恢复 10.5 联机备份与恢复 10.5.1 归档日志模式的设置 10.5.2 创建恢复目录所用的表空间 10.5.3 创建RMAN用户并授权 10.5.4 创建恢复目录 10.5.5 注册目标数据库 10.5.6 使用RMAN程序进行备份 10.5.7 使用RMAN程序进行恢复 10.6 自动备份与恢复 10.6.1 闪回数据库 10.6.2 闪回表 10.6.3 闪回回收站 10.6.4 闪回查询 10.6.5 闪回版本查询 10.6.6 闪回事务查询 10.7 几种备份与恢复方法的比较 第11章 控制文件及日志文件的管理 11.1 控制文件 11.1.1 控制文件概述 11.1.2 多路复用控制文件 11.1.3 控制文件的创建 11.1.4 控制文件的备份与恢复 11.1.5 控制文件的查询与删除 11.1.6 OEM中控制文件的管理 11.2 日志文件 11.2.1 日志文件及存储策略 11.2.2 增加日志组和日志成员 11.2.3 设置日志自动存档功能 11.2.4 监视日志工作 第12章 数据库控制 12.1 用事务控制操作 12.1.1 什么是事务 12.1.2 设置事务 12.1.3 事务提交 12.1.4 事务回滚 12.1.5 设置回退点 12.2 用锁控制并发存取 12.2.1 为何加锁 12.2.2 加锁的方法 第13章 Oracle数据库的安全管理 13.1 Oracle数据库安全性概述 13.1.1 Oracle 11g的安全性体系 13.1.2 Oracle 11g的安全性机制 13.2 用户管理 13.2.1 创建用户 13.2.2 修改用户 13.2.3 删除用户信息 13.2.4 查询用户 13.3 虚拟专用数据库 13.3.1 基于行的VPD 13.3.2 基于列的VPD 13.4 透明数据加密(’FDE) 13.4.1 创建Oracle钱夹 13.4.2 加密表 13.4.3 加密表空间 13.5 对备份进行加密 13.5.1 透明加密模式 13.5.2 基于密码的加密模式 13.5.3 混合加密模式 第14章 留言板系统 14.1 系统概述 14.1.1 留言板系统的应用背景 14.1.2 留言板系统的总体需求 14.1.3 留言板系统的功能分析 14.1.4 留言板系统的设计思路 14.2 系统功能模块设计 14.2.1 系统框架 14.2.2 系统功能模块划分 14.3 数据库设计 14.3.1 数据库需求分析 14.3.2 数据库概念结构设计 14.3.3 数据库逻辑结构设计 14.3.4 数据库表的创建 14.3.5 数据库的连接 14.4 系统主要功能模块的设计与实现 14.4.1 用户登录模块 14.4.2 添加留言模块 14.4.3 回复留言模块 14.4.4 访问留言人主页 14.4.5 删除留言 14.4.6 修改密码 14.5 本章小结 第15章 新闻发布系统 15.1 系统概述 15.1.1 新闻发布系统的应用背景 15.1.2 新闻发布系统的总体需求 15.1.3 新闻发布系统的功能分析 15.1.4 新闻发布系统的设计思路 15.2 系统功能模块设计 15.3 数据库设计 15.3.1 数据库需求分析 15.3.2 数据库概念结构设计 15.3.3 数据库逻辑结构设计 15.3.4 数据库表的创建 15.3.5 数据库的连接 15.4 网站总体框架 15.4.1 文件布局 15.4.2 网站首页的运行结果 15.5 系统后台主要功能模块的设计与实现 15.5.1 登录模块设计 15.5.2 管理员维护模块设计 15.5.3 新闻管理模块设计 15.6 系统前台主要功能模块的设计与实现 15.6.1 今日新闻的显示 15.6.2 查找新闻 15.6.3 查看新闻人物和投票 15.7 本章小结 附录A 0racle 11g词汇集锦 附录B 0facle 11g选件概述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值