ORACLE
游标
一. PL/SQL
是用游标来管理 SQL
的 SELECT
语句的 .
游标是为了处理这些语句而分配的一大块内存 .
它提供了对一个结果集进行逐行处理的能力 ,
可看作是一种特殊的指针 .
它与某个查询结果集相关联 ,
可以指向结果集的任意位置 ,
以便对指定位置的数据进行处理 .
使用它可以在查询数据的同时对数据进行处理 .
二.
游标的分类 :
静态游标和动态游标
1.
在说明游标分类之前,
先说明一下PL/SQL
的两个操作,
游标属性,
变量属性
SET SERVEROUTPUT ON ;--
此语句用于开启打印输出功能
DMBS_OUTPUT.PUT_LINE();--
打印输出并换行.
%FOUND:
判断当前游标是否指向有效的一条行记录.
是则返回TRUE,
否则返回FALSE
%NOTFOUND:
与%FOUND
恰好相反.
%ISOPEN:
判断游标是否打开,
打开则返回TRUE,
否则返回FALSE.
%ROWCOUNT:
判断当前游标在所指向的结果集中提取的行数.
并非所有总记录数
%TYPE:
声明变量的类型与表中的某列的数据类型完全一致.%TYPE
声明有两个好处:
一是你不必知道某列的确切数据类型二是当某列的数据类型改变时不用修改变量的数据类型.
%ROWTYPE:
声明变量的数据类型与表中的行记录数据类型一致.
对于自定义的记录,
则必须声明自己的域.
2.
静态游标:
静态游标又可以分为两类:
1)
隐式游标
隐式游标的特点:
-
隐式游标是由PL/SQL
来管理的,
即不需要声明游标语句,
也不需要OPEN,FETCH,CLOSE
操作
-
隐式游标中必须要有select cur_name into [
变量名或其他数据类型].
此句完成OPEN,FETCH,CLOSE
操作.
-
隐式游标只能返回一行记录,
如果无符合条件的记录将会出现NO_DATA_FOUND
异常.
如果出现多条记录将出现TOO_MANY_ROWS
异常.
-
隐式游标只能用SQL%
判断其游标属性
-
对于任何位置使用SQL%ISOPEN
结果都是FALSE,
隐式游标由PL/SQL
管理
-
对于在隐式游标位置前使用SQL%FOUND
或SQL%NOTFOUND, SQL%ROWCOUNT
结果值是NULL(
不确定值)
示例表:
表名:test
字段名
|
数据类型
|
可否为空
|
id(
序号)
|
number
|
N
|
name(
姓名)
|
varchar2(20)
|
N
|
zym(
专业名)
|
varchar(40)
|
Y
|
cj(
成绩)
|
number
|
Y
|
logdate(
记录日期)
|
date
|
Y
|
EG1:
验证隐式游标的特性
set
serveroutput on;--
开启输出
declare
no
test.id%type;--
声明变量no
的数据类型同test
表的id
列一致
ename test.name%type;
begin
if
sql%isopen then
--
判断游标是否打开
dbms_output.put_line(' cursor is openning');
else
dbms_output.put_line('cursor is closed');
end
if;
if
sql%notfound then –
判断游标是否指向有效的行
dbms_output.put_line('no value');
else
dbms_output.put_line(no||' '||ename);
end
if;
dbms_output.put_line(sql%rowcount);
dbms_output.put_line('---------------');
/**
去掉where
条件时,
将会出现too_many_rows
异常**/
select id ,name into no ,ename from test where
cj=90;--
隐式游标必--
须使用INTO
dbms_output.put_line(sql%rowcount);
if
sql%isopen then
dbms_output.put_line(' cursor is openning');
else
dbms_output.put_line('cursor is closed');
end
if;
if
sql%notfound then
dbms_output.put_line('no value');
else
dbms_output.put_line(no||' '||ename);
end
if;
exception
when
no_data_found then
dbms_output.put_line('no value');
when too_many_rows then
dbms_output.put_line('too many rows');
end;
执行结果为:
cursor is closed
--------------------
1
cursor is closed
1001 qbnajj
去掉where
条件时的结果:
cursor is closed
--------------------
too many rows
EG2:
使用%ROWTYPE
declare
rowtype test%rowtype;
begin
select * into rowtype from test where cj=90;
dbms_output.put_line(rowtype.name||'
'||rowtype.cj);
exception
when
no_data_found then
dbms_output.put_line('no value');
when
too_many_rows then
dbms_output.put_line('too many rows');
end;
执行结果:
qbnajj 90
EG3:
自定义RECORD
数据类型
declare
/**
自定义RECORD
数据类型
语法为:
TYPE type_name IS RECORD(cloumn1 datatpe,.....);
**/
type
r_type is record(name test.name%type ,cj test.cj%type);
re_type r_type;
begin
select name,cj into re_type from test where
cj=90;
dbms_output.put_line(re_type.name||'
'||re_type.cj);
exception
when
no_data_found then
dbms_output.put_line('no value');
when
too_many_rows then
dbms_output.put_line('too many rows');
end;
/
执行结果:
qbnajj 90
2)
显示游标
声明语法:
DECLARE
CURSOR
cur_name(
参数名 数据类型) is select_satatements ;--
游标名后--
可带参数
BEGIN
OPEN cur_name;
FETCH cur_name into [
变量或者其他数据类型];
--
可用循环语句迭代输出游标所指向的结果集.
CLOSE cur_name;
END;
显示游标特性:
-
显示游标由用户定义,
并由用户来管理游标,
可返回多行记录.
-
通常使用显示游标需要遵守以下规则
声明游标 ->
打开游标 ->
读取数据 ->
关闭游标
但由于FOR IN LOOP
语句包含OPEN,FETCH,CLOSE
操作所以不在此例.
-
查看游标属性时,
使用cur_name%.
EG:PL/SQL
演示
declare
no
test.id%type;
ename test.name%type;
cjs
test.cj%type;
cursor test_cur is
select id,name from test where cj>=cjs;--
可通过PL/SQL
绑定变量输--
入值(&cjs)
begin
cjs:=50;
for
t_cur in test_cur
loop
no:=t_cur.id;
ename:=t_cur.name;
dbms_output.put_line(no||' '||ename);
end
loop;
end;
执行结果:
chenjunhua 80
qbnajj 90
cjh 52
EG2:
利用带参数的存储过程演示
create or replace procedure test_proce(cjs
in test.cj%type)
as
no
test.id%type;
ename test.name%type;
cursor test_cur is
select id,name from test where cj>=cjs;
begin
open
test_cur;
fetch test_cur into no,ename;
while test_cur%found
loop
dbms_output.put_line(no||' '||ename);
fetch test_cur into no,ename;--
将游标指向下条记录,
否则为死循环.
end
loop;
close test_cur;
end
test_proce;
exec
test_proce(50);
执行结果:
chenjunhua 80
qbnajj 90
cjh 52
EG3:
带参数的游标与上面的类似
2.
动态游标(REF CURSOR)
首先 ,
游标变量和游标是两个不同的概念 .
与游标相似 ,
游标变量是指向多行查游标询的结果集的当前行 .
游标是静态的 ,
游标变量是动态的 ,.
同时游标变量并不参与与特定的查询绑定 ,
所以可以为任何兼容的查询打开游标变量 ,
从而提高灵活性 .
而且 ,
还可以将新的值赋予游标变量 ,
将它作为参数传递给本地和存储过程 .
游标变量针对每个 PL/SQL
用户都是可用的 ,
可以在客户端完全使用游标变量 .ORACLE
服务器同样包含 PL/SQL
引擎 ,
可以将游标变量在应用和服务器之间进行传递 .
1.
游标变量 :
声明游标实际上是创建一个指针 ,
指针具有数据类型 REF X.REF
是 REFERENCE ,X
是表示类对象 .
因此 ,
游标变量具有数据类型
REF CURSOR.
注 :
游标总是指向相同的查询工作区 ,
游标变量能够指向不同的工作区 ,
因此游标和游标变量不能互操作 .
3.
定义 REF CURSOR
类型 ,
创建游标变量有两个步骤 :
1)
定义 REF CURSOR
类型
语法格式 :
TYPE ref_type_name
IS
REF CURSOR [RETURN return_type]
说明 :
ref_type_name
是游标变量中使用的类型 ;return_type
必须是一个记录 (record)
或者数据库表中的一行 .(rowtype)
下面定义 一个 REF CURSOR
类型游标
DELARE
TYPE
xs_cur
IS
REF CURSOR
RETURN xs%ROWTYPE;
注意 :
REF CURSOR
类型既可以是强类型 ,
也可以是弱类型 ,
区别是强类型有返回类型 ,
弱类型没有 .
如下所示
DECLARE
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;--
强类型
TYPE mycur IS REF CURSOR;--
弱类型
2)
声明这种类型的游标变量 :
一旦定义了 REF CURSOR
类型就可以在 PL/SQL
块或子程序中声明这个游标变量 .
如 :
DECARE
TYPE xs_cur REF CURSOR RETURN
xs%ROWTYPE;
xscur xs_cur;
当然 ,
在 RETURN
子句中也可以定义自定义的 RECORD
类型 ,
如 :
DECLARE
TYPE kc_cj IS RECORD
(
kch number (4),
kcm number(10),
cj number(4,2)
);
TYPE kc_cjcur IS REF CURSOR RETURN kc_cj;
此外 ,
也可以声明游标变量作为函数和过程的参数 .
例如 :
DECLARE
TYPE
xs_cur IS REF CURSOR RETURN xs%ROWTYPE;
PROCEDURE
open_xs (xscur IN OUT xs_cur)IS
......................
3.
控制游标变量
使用游标变量时 ,
要遵循以下步骤 :OPEN-FETCH-CLOSE
OPEN
语句与多行查询的游标变量相关联 ,
它执行查询 ,
标志结果集
语法格式 :
OPEN
{cursor_variable|:host_cursor_variable }FOR
{
select_statement|dynamic_string[USING
bind_argument[,......]]
}
如 :
IF NOT xscur%ISOPEN THEN
OPEN xscur FOR SELECT * FROM xs;
END IF ;
游标变量同样可以使用游标属性 :%FOUND,%ISOPEN,%ROWTYPE
在使用过程中 ,
其他的 OPEN
语句可以为不同的查询打开相同的游标变量 .
因此 ,
在重新打开之前 ,
不要关闭游标变量 .
可以打开游标 ,
并作为参数传递给存储过程 .
如 :
CREATE PACKAGE xs_data AS
...
TYPE xs_cur IS REF CURSOR RETURN xs%ROWTYPE;
RROCEDURE open_xs(xscur IN OUT xs_cur);
END xs_data;
CREATE PACKAGE BODY xs_data AS
...
PROCEDURE open_xs(xscur IN OUT xs_cur)
AS
BEGIN
OPEN xscur FOR
SELECT * FROM xs;
END open_xs;
END xs_data;
当声明一个游标变量作为打开游标变量子程序的参数时 ,
必须定义 IN OUT
模式 .
也就是说 ,
子程序可以将一个打开的游标变量传递给调用者 .
分享到:
相关推荐
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
一名合格的程序猿修炼手册.
5MHz 函数发生器使用说明书
99- 矿山工业互联网平台解决方案.pptx
网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
基于提供的字段介绍,我们可以设计一个基础的工厂工资明细表Excel模板结构如下: | 序号 | 姓名 | 工种 | 工作天数 | 工时费/天 | 小计(正常工资) | 加班时间 | 加班费率/小时 | 小计(加班工资) | 预借 | 合计(实发工资) | 签字 | 备注 | | ---- | ---- | ---- | -------- | ---------- | -------------- | -------- | -------------- | --------------- | ---- | -------------- | ---- | ---- | | 1 | | | | | | | | | | | | | | 2 | | | | | =D2*C2
随着市场竞争的不断加剧和客户需求的多样化,传统的供应链管理模式面临着高成本、高库存和重资产等一系列挑战。为了有效应对这些挑战,企业亟需通过数字化转型来重塑供应链管理,实现效率提升和成本降低。本资料《供应链管理:高成本、高库存、重资产的解决方案》提供了针对这些问题的综合性数字化解决方案。在这份精品资料中,读者将了解到如何利用先进的信息技术手段,如大数据、云计算、物联网(IoT)和人工智能(AI),对供应链进行优化。通过实时数据分析,企业能够精准预测市场需求,从而减少过剩库存,降低仓储成本。同时,智能化的供应链协同平台可以加强供应商与制造商之间的合作,提高响应速度和灵活性,缩短产品交付周期。此外,资料还深入探讨了如何通过数字技术实现供应链的可视化管理,使企业能够全面掌握供应链的每一个环节,及时发现并解决问题,避免成本浪费。通过采用轻资产运营模式,企业能够减轻固定资产负担,提高资本使用效率。最终,这份资料不仅为企业提供了一套完整的供应链数字化转型路径,还结合具体案例分析,展示了数字化转型如何在实际操作中带来显著成效,帮助企业在激烈的市场竞争中保持领先地位。重新回答||
适合相关科研人员,新手借鉴啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
STM32学习软件编程资料,STM32F103C8单片机经典外设应用设计实例软件源代码,KEIL工程文件,可供学习参考。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
菜鸟自制流密码.docx
基于大数据的房产估价 基于大数据的房产估价是一种利用海量数据和分析技术来评估房地产价值的方法。它通过收集、整合和分析各种与房地产相关的数据,以提供更加准确、全面的房产估价服务。 首先,大数据在房产估价中的应用主要体现在数据收集和处理上。这些数据可能包括不同时间点的房产属性、成交量、成交额、成交时长等,以及消费者线上行为数据和市场交易数据等。这些数据可以来自于多个渠道,如政府部门、房地产机构、互联网平台等。通过对这些数据的收集、清洗、整合和分析,可以更加准确地判断房地产市场的现状和趋势,为房产估价提供有力的数据支持。 其次,基于大数据的房产估价方法还可以结合地理信息系统(GIS)和其他技术工具,对房地产价格进行精细化分析。例如,可以利用GIS系统判断各类城市生活配套设施对房地产价格影响的权重,或者结合消费者行为数据和交易数据,分析目标消费者的核心需求和迫切程度,从而更准确地判断房地产项目的可行性和市场潜力。 此外,基于大数据的房产估价还可以利用机器学习、人工智能等先进技术,构建预测模型,对房地产市场的未来发展进行预测和研判。这些模型可以根据历史数据和趋势,分析各种因素对房地产价格的
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
5G通信、网络优化与通信建设
网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。系统化是必要的,设计网上系统不仅会节约人力和管理成本,还会安全保存庞大的数据量,对于信息的维护和检索也不需要花费很多时间,非常的便利。 网上系统是在MySQL中建立数据表保存信息,运用SpringBoot框架和Java语言编写。并按照软件设计开发流程进行设计实现。系统具备友好性且功能完善。 网上系统在让售信息规范化的同时,也能及时通过数据输入的有效性规则检测出错误数据,让数据的录入达到准确性的目的,进而提升数据的可靠性,让系统数据的错误率降至最低。 关键词:vue;MySQL;SpringBoot框架 【引流】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
抛光机_零件图_机械工程图_机械三维3D建模图打包下载.zip
Cambro 2020 21 产品目录