【PLSQL】变量声明,结构语句,cursor游标
************************************************************************ ****原文: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 标量类型
数字类型:
u
number
u
number的子类型dec(38),float(38),real(38)
u
binary_integer(仅仅能用于plsql)
字符型:
u
varchar2,varchar
u
string(仅仅能用于plsql)
u
char
u
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游标的更多相关文章
- 转 oracle cursor 游标
转自:http://blog.csdn.net/liyong199012/article/details/8948952 游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定 ...
- .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 ...
- C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?
报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf(&quo ...
- switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
- postgresql PL/pgSQL—存储过程结构和变量声明
ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...
- SQL SERVER CURSOR游标的使用(转载)
一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据 ...
- cursor游标(mysql)
/* 游标 cursor 什么是游标?为什么需要游标 使用存储过程对sql进行编程的时候,我们查询的语句可能是数据是多个,它总是一口气全部执行,我们无法针对每一条进行判断.也就是说,我们无法控制程序的 ...
- SQL表变量与临时表区别 + 非游标临时表遍历
SQL表变量与临时表区别 + 非游标临时表遍历 分类: SQL Server2009-11-27 17:01 1196人阅读 评论(2) 收藏 举报 sqlinsert存储sql servermicr ...
- 变量声明---let,const,解构
let在很多方面与var是相似的,但是可以帮助大家避免在JavaScript里常见一些问题. const是对let的一个增强,它能阻止对一个变量再次赋值. 块作用域 当用let声明一个变量,它使用的是 ...
随机推荐
- cocos2dx的模板容器简单使用(Vector,Map,Value)
在cocos2dxv3.0beta之前存在顺序性容器cocos2d::CCArray,和cocos2d::CCDictionary.可是在新版本号之后这两个容器都将被cocos2d::Vector&l ...
- Python-Tkinter的Entry详解
#Tkinter教程之Entry篇 #Entry用来输入单行文本 '''1.第一个Entry程序''' from Tkinter import * root = Tk() Entry(root,tex ...
- JDBC数据库编程常用接口(转)
JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口(API),制定了统一的访问各种关系数据库的标准接口,为各个数据库厂商提供了标准接口的实现.这东西能够 ...
- maven 项目中使用 jstl标签
在pom.xml文件下面增加如下的依赖包: <dependency> <groupId>javax.servlet</groupId> <artifactId ...
- zabbix 监控特定进程
因为一些server上跑着一些重要程序,须要对它们进行监控,公司用的是zabbix监控,之前都是在zabbix中加入自己定义脚本对特定程序进行监控,近期看了zabbix的官方文档,发现原来强大的zab ...
- Ubuntu 组态 Tomcat而每天的错误解决
统环境:Ubuntu 14.10 安装版本号:apache-tomcat-7.0.54.tar.gz 安装步骤: 1.下载 Tomcat 下载 apache-tomcat-7.0.54.tar.gz ...
- 怎样配置nginx同一时候执行不同版本号的php-fpm
在/usr/local/php/etc/php-fpm.conf里找到 listen = 127.0.0.1:9000 将port9000改动为9001 在对应的nginx配置里也做相同的port改动
- jquey :eq(1)
$("#div_Goods .datagrid-row .numberbox:eq(1)") $("#div_Goods .datagrid-row .numberbox ...
- java战斗系列-战斗MAVENPW结构
实战中MAVEN私服的搭建 利用maven来管理项目的构建,报告和文档已经成为了我们如今的共识,不论什么开源软件基本都在使用,当然我们如今的大部分公司也基本都在使用,我把曾经使用maven的一些经 ...
- addChildViewController transitionFromViewController nib storyboard
本文记录addChildViewController由transitionFromViewController方法nib,storyboard的不同的效果. 在进行切换效果时,注意属于同一个story ...