【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运行过程

客户端应用程序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 徐长亮的专栏
************************************************************************

时间: 2024-10-07 20:30:05

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

转 oracle cursor 游标

转自:http://blog.csdn.net/liyong199012/article/details/8948952 游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率. 游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...I

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

报错信息:error C2065: 'salary' : undeclared identifier #include <stdio.h> void main(){ printf("我的成绩是100分!");//不使用变量 int salary;//使用变量 salary = 100; printf("我的成绩是%d分!",salary); return 0; } 问题根源:编译器问题——C89和C99 C89规定,在任何执行语句之前,在块的开头声明所有

C/C++第一天开班,序章:结构体变量声明、实例化及输出

今天第一天开班,以后会不定期更新C/C++的基础内容,希望大家能多多喜欢,若大家有好的建议,请给我留言. 今天的主题:结构体变量声明.实例化及输出 代码如下: 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 struct People{ 6 char Name[10]; 7 int Age; 8 };//定义包含名称和年龄字段的结构体People 9 10 int main(){ 11

c语言 struct结构体的变量声明加冒号

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可. 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示. [1]定义: struct 位域结构名 { 位

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

一:认识游标 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合. 游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录. 二:游标的基本形式 声明游标:形式1DECLARE cursor_name [INSENSITIVE] [SCROLL] CURS

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

SQL表变量与临时表区别 + 非游标临时表遍历 分类: SQL Server2009-11-27 17:01 1196人阅读 评论(2) 收藏 举报 sqlinsert存储sql servermicrosoftstatistics 问题 1:为什么在已经有了临时表的情况下还要引入表变量? 解答 1:与临时表相比,表变量具有下列优点: 如 SQL Server 联机丛书“表”(Table) 一文中所述,表变量(如局部变量)具有明确定义的范围,在该范围结束时会自动清除这些表变量. 与临时表相比,表变

cursor游标(mysql)

/* 游标 cursor 什么是游标?为什么需要游标 使用存储过程对sql进行编程的时候,我们查询的语句可能是数据是多个,它总是一口气全部执行,我们无法针对每一条进行判断.也就是说,我们无法控制程序的运行,所以引入了游标cursor cursor类似于java中的迭代器. 它利用查询语句生成一个游标,然后游标中有一个类似指针的东西.首先指在游标首,就是迭代器.不解释了 cursor 游标 declare声明: declare 游标名 cursor for select_statement; op

cursor(游标)

原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理. 游标的概念 1.1游标(Cursor) 它使用户可逐行访问由SQL Server返回的结果集. 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式. 用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合. 游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录. 1.2SQL语言与主语言具有不同数据处理方式 (

Swift 详解之一 -------- 变量声明

变量声明 1.普通变量 swift 像javascript一样是可以智能推断类型的,他会根据我们变量的值来推断变量的类型 var age = 10 // Int var name ="lily" //编译器会自动推断出String static let name = "MyClass" //静态常量 通过类名直接访问 eg: ClassName.name 2.存储型变量或者存储型属性 语法:var variable name: type = expression 例