************************************************************************
  ****原文:blog.csdn.net/clark_xu 徐长亮的专栏
************************************************************************

PLSQL是ORACLE在标准SQL基础上添加了过程化处理,把DML和SELECT语句组织在PLSQL代码的过程性单元中。

PLSQL扩展了变量和类型。控制语句。过程和函数。

1.1
PLSQL程序结构

PLSQL块包含:

声明部分:DECLARE

运行部分:begin

异常处理:exception

比如:

declare

v_AccountID number(5) :=1001;

v_RealName varchar(20)

Begin

select real_name into v_RealName

from account where id=v-Accountid

exception

when no_data_found then

insert into Fee_log(descr)

values(“account 1001 does not exist!”);

commit;

end;

1.2 PLSQL执行过程

client应用程序PLSQL:-----PLSQL引擎(过程性语句运行器)----sql语句运行器

凝视:

单行凝视:——

多行凝视:/*  */

1.3变量和数据类型

标量类型包含:数字型。字符型,日期型,布尔型

复杂类型包含:record,associative array,nested table, varray

1.3.1 标量类型

数字类型:


number


number的子类型dec(38),float(38),real(38)


binary_integer(仅仅能用于plsql)

字符型:


varchar2,varchar


string(仅仅能用于plsql)


char


long

Date

Boolean

u  用于存储逻辑值

u  不能像数据库中插入boolean类型的数据

u  不能讲列植保存到boolean变量中。

u  仅仅能对boolean变量运行逻辑操作;

1.3.2变量声明

语法:

var_name type [constant] [not null] [:=value];

PLSQL规定没有初始化的变量为NULL

比如:

declare

v_realName varchar2(20);

v_baseCost number(7,2) :=5.9;

v_count binary_integer :=0;

1.3.3 %TYPE方式

变量具有和数据库的表中某列或其它变量同样的类型。

declare v_realName varchar2(20);

declare v_realName account.real_name%TYPE;

declare

v_tempvar number(7,3) not null :=12.3;

v_anothervar v_tempvar%type
:=12.3;

1.4 条件语句

if Boolean_expression1 Then

ELSIF Boolean_expression2 then

ELSE

END IF;

1.5 Loop循环语句

loop

statement1;

statement2;

exit when condition

end loop;

1.6 while循环语句

while Boolean_expresstion loop

statement1;

statement2;

end loop;

1.7 for循环语句

for 循环器 in下限。。上限 loop

statement1;

statement2;

exit when condition

end loop;

1.8 PLSQL中的DML

能够在PLSQL中石油标准SQL:

1.      
DML

2.      
事务控制语句TCL

比如,begin

insert into host(id) values(’10.0.2.1’);

commit;

end;

PLSQL中本地动态SQL是使用execute immediate语句来运行ddl语句

比如,begin

execute immediate ‘CREATE TABLE TEST(c1 number)’;

end;

DML语句使用本地动态sql来实现的(使用execute immediate语句实现)

比如。begin

execute immediate ‘insert into test values (1)’;

end;

sql语句的编译发生在PLSQL语句块的编译阶段;

sql语句的运行发生在PLSQL语句的运行阶段;

全部一般这样写:

begin

execute immediate ‘CREATE TABLE TEST(c1 number)’;

execute immediate ‘insert into test values (1)’;

end;

此时PLSQL编译的时候,create语句insert语句为字符串,不须要sql语句编译;

因此。PLSQL语句完毕建表和插入数据的时候。必须使用execute immediate;

1.9 PLSQL语句中的SELECT语句

依据select语句返回的记录数。实现分为两类:

当仅返回一条记录的时候:

select … into …语句实现;

当返回0条或者多条记录的时候

用cursor指针来实现

若结果是单行单列,into字句后用标量类型。与字段类型同样;

若查询结果为单行多列,into子句后的变量个数,顺序,数据类型和select语句后面的目标匹配,也能够用记录record类型类记录;

1.9.1 record类型

语法定义:

type t_cout_rec is record             //记录类型为t_cost_rec

(        base_cost cost.base_cost%type,

base_duration cost.base_duration%type;

unit_cost cost.unit_cost%type

)

v_cost t_cost_rec;

v_cost_1 t_cost_rec;

1.9.2 %ROWTYPE

用表结构和视图结果定义变量。record类型。record成员的名称和类型与表或者视图的列名称和类型全然同样。

比如,v_cost cost%ROWTYPE;

1.9.3 record变量的引用

begin

v_cost.base_cost:=5.9

v_cost.base_duration:=20;

v_cost.unit_cost:=0.4

v_cost_1=:=v_cost;

select base_cost,base_duration,unit_cost int v_cost_1 from cost;

end;

在inert语句和update语句中使用记录类型变量

比如,如果cost_t1表事先存在

begin

insert into cost_t1 values v_cost;

update cost_t1 set row=v_cost_1;

commit;

end;

1.10 cursor游标

依据select语句返回的记录数,若返回记录数为0条或者多条用cursor实现;

oracle所知晓的每个sql语句都有唯一的cursor与之想相应。

oracle使用专用的sql工作去来运行sql语句。存储处理信息,这个工作去称为“cursor”

cursor分为隐式cursor和显式的cursor

隐式cursor:

--select .. into语句

--DML语句

1.10.1 显式cursor的处理:

declare声明游标:床和命名一个sql工作区;

open打开游标

fetch提取游标

推断是否empty:结果集中是否有未提取的记录;

close关闭游标

1.10.2 显式cursor的属性:

%isopen, 布尔类型,

%notfound,布尔类型。假设前一个fetch语句没有返回一行记录,其值为true;

%found,布尔。假设前一个fetch语句返回记录,其值为true,与%notfound;

%rowcount,数值,到眼下为止,cursor已提取的总行数。

1.10.3 隐式cursor的属性

sql%isopen, 布尔类型,DML运行中未true,结束后为false

sql%notfound,布尔类型,与sql%found返回值相反

sql%found,       布尔类型,值为true表DML操作成功

sql%rowcount, 数值类型,表示DML语句成功运行的数据行数。

1.10.4 cursor的使用

声明

在游标声明中使用标准的select语句,假设须要依照指定的次序处理行,可在查询中使用order by字句;能够在查询中引用变量,可是必须在cursor语句之前声明这些变量

cursor c_service_id(p_cost_id number) is

select id from service where cost_id=p_cost_id;

open

通过open cursor来运行select语句并标识结果集。select语句假设没有返回记录,不会出现异常语法;

open c_service_id(5);

fetch cursor   

检索当前行,把值赋给变量;变量能够是record类型或者简单变量;假设是简单变量,要求例如以下:包括同样数量的变量;把每个变量和对应的列进行位置匹配。通过循环检測cursor中是否包括数据行;

fetch cursor_name into [var1,var2,…| recore_name];

fetch c_service_id into v_service_id;

1.10.5 结果集提前的控制

使用循环处理显式cursor结果集的多行数据;每次fetch一行。重复进行;使用%notfound属性检測一次不成功的提前操作;使用显式cursor的属性检測每一次的提前是否成功。避免出现无限循环。

1.10.6 关闭游标

处理完结果集中的是数据后,应该关闭cursor;假设须要,能够再次打开该curosr。

cursor一旦关闭。全部和该cursor相关的资源都会被释放。不能够再从关闭的cursor中提前数据,能够引起invalid_cursor错误;

close c_service_id;

************************************************************************
  ****原文:blog.csdn.net/clark_xu 徐长亮的专栏
************************************************************************

【PLSQL】变量声明,结构语句,cursor游标的更多相关文章

  1. 转 oracle cursor 游标

    转自:http://blog.csdn.net/liyong199012/article/details/8948952 游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定 ...

  2. .Net程序员学用Oracle系列(26):PLSQL 之类型、变量和结构

    1.类型 1.1.属性类型 1.2.记录类型 2.变量 2.1.变量类型 2.2.变量定义 2.3.变量赋值 3.结构 3.1.顺序结构 3.2.选择结构 3.3.循环结构 4.总结 1.类型 在&l ...

  3. C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?

    报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf(&quo ...

  4. switch语句下的变量声明和定义

    switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...

  5. postgresql PL/pgSQL—存储过程结构和变量声明

    ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...

  6. SQL SERVER CURSOR游标的使用(转载)

    一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...

  7. cursor游标(mysql)

    /* 游标 cursor 什么是游标?为什么需要游标 使用存储过程对sql进行编程的时候,我们查询的语句可能是数据是多个,它总是一口气全部执行,我们无法针对每一条进行判断.也就是说,我们无法控制程序的 ...

  8. SQL表变量与临时表区别 + 非游标临时表遍历

    SQL表变量与临时表区别 + 非游标临时表遍历 分类: SQL Server2009-11-27 17:01 1196人阅读 评论(2) 收藏 举报 sqlinsert存储sql servermicr ...

  9. 变量声明---let,const,解构

    let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题. const是对let的一个增强,它能阻止对一个变量再次赋值. 块作用域 当用let声明一个变量,它使用的是 ...

随机推荐

  1. Volley该框架使用了大量的请求图片

    尊重原创 http://write.blog.csdn.net/postedit/26142025 代码下载:http://download.csdn.net/detail/yuanzeyao2008 ...

  2. 关于Platinum库的MediaRender具体C++代码实现探讨

    接上篇博文 NDK下 将Platinum SDK 编译成so库 (android - upnp) 讲述了如何利用该代码库编译给android程序调用的so库,其中也提到了,在使用sample-upnp ...

  3. oracle ebs 12.20 安装成功其过程失败日记及总结(1)

    由于公司业务须要,须要安装oracle ebs进行 form 开发,所以就開始了痛苦oracle ebs安装之过程.刚開始是在vm中win2003 server 中安装ebs,,不知是我自已的水平太差 ...

  4. IIS架构与HTTP请求处理流程

    IIS架构与HTTP请求处理流程 Windows操作系统中的IIS负责提供互联网服务,一台运行了IIS的计算机可以看成是一台Web服务器. Windows XP SP2 中IIS主版本号为5,Wind ...

  5. 重构ConditionHelper

    在上一篇日志写了ConditionHelper的具体实现方法和它的用法,但那时只是把心里所想的一个思路用代码记录下来,而没有经过实践检 验的,难免存在一些问题,但在最近的一个新项目中用到Conditi ...

  6. libgdx如何调用android平台内容

    使用libgdx已经有一段时间了.最近经常有朋友问我如何在libgdx中调用android的内容. 正常来说libgdx是跨平台的,gdx中的代码是不允许有任何其他平台的相关代码,但实际使用时经常会有 ...

  7. Nagios+pnp4nagios+rrdtool 安装配置nagios(一)

    基于的软件版本 Apache-2.0.63  php-5.3.2 nagios-3.2.3  nagios-plugins-1.4.15  rrdtool-1.4.5 nrpe-2.12 pnp4na ...

  8. 矩形旋转碰撞,OBB方向包围盒算法实现

    怎样进行2D旋转矩形的碰撞检測.能够使用一种叫OBB的检測算法(Oriented bounding box)方向包围盒.这个算法是基于SAT(Separating Axis Theorem)分离轴定律 ...

  9. HiPAC高性能规则匹配算法之查找过程

    收到一封邮件,有位朋友认为我误解了nf-HiPAC.如此的一个高性能算法怎能被什么传统的hash,tree之类的胁迫.是啊.HiPAC是一个非常猛的算法.文档也比較少,这就更加添加了其神奇感,可是这决 ...

  10. POJ 1324 Holedox Moving 搜索

    题目地址: http://poj.org/problem?id=1324 优先队列---A*的估价函数不能为蛇头到(1,1)的距离,这样会出错. 看了discuss,有大神说这题A*的估价函数为BFS ...