游标

理解 ArcObjects 中的游标

蹲街弑〆低调 提交于 2019-11-27 00:08:03
写在前面的话:本文是ArcUser 2006 7-9 月一期中的一篇文章:介绍了 Arcobjects 中的 Cursor对象,节选翻译而来 cursor 和featurecursor 是非常相似的对象: cursor 是用于操作表,而后者用于操作要素类 ,也可以这样说,cursor 是一种为了特定目的——操作存储在传统数据库表中的记录子集——而建立的类结构,而 featurecursor 的记录子集则是存储在 shapefile 文件、个人 geodatabase 或企业级 geodatabase 中。 在 Cursor 和 FeatureCursor 类群中有 三种类型的 cursor 。最常用的是 SearchCursor ,它被用于查询操作以返回一个满足查询条件的记录子集。Search Cursor 是一种只读的 cursor,你可以用它遍历获取的信息。你不能使用这种游标来插入、更新或删除表中的记录。 Insert Cursor 是专门用于往一个表中插入一条新记录,而 Update Cursor 则是用于更新或删除记录,这两个cursor 返回的记录可以通过一个属性或空间查询来限定。为了你进行的操作产生恰当类型的 cursor 是非常重要的。例如,不要产生一个search cursor,如果你试图更新一个表中的记录。正如前面提到的,search

数据库-存储过程-游标-函数

六眼飞鱼酱① 提交于 2019-11-26 22:09:46
一、存储过程 SQL99标准提出的SQL-invoked-rountines的概念,它开分为存储过程与函数,这里首先介绍存储过程 存储过程分为三类:系统存储过程(如:sp_help)、自定义存储过程、扩展存储过程 存储过程可以理解为一个SQL语句块,完成一些复杂的功能,当然可以包含应用程序的业务,比如:分页,生成订单号等,存储过程可以接收应用程序传递的参数,并将查询的结果返回给应用程序 1、存储过程的优点: 1)、运行效率高,因为存储过程不会在每一次调用时都解释执行,随便说一句,SQL执行后的执行计划会放在缓存中,这样下一次相同的SQL执行就不用再次优化了,从而加快速度 2)、存储过程降低了客户机与服务器的通信量,使用存储过程,就不用在应程序中拼SQL传回服务器,只须要存储过程名与参数就可以了 3)、方便实施企业规则,可以在存储过程里加入业务逻辑 2、存储过程的使用(重复使用) 创建: create proc pc_whc as select * from whc /*执行*/ exec pc_whc 二、游标 游标可以理解为一个"指针",其指向的是一条记录,当用select语句得到一个结果集时,我们可以将它放到一个游标中,然后通过移动游标来读取每一条数据,并进行处理,感觉有点"遍历"数据 游标的使用: 1、 定义游标:declare cursor_name cursor For

第515篇--Interview Summary (Sql Server)

怎甘沉沦 提交于 2019-11-26 21:36:37
在面试的时候, SQL 也是一个重点,总结一下以前的面试题目: 1 面试常见问题 SQL 聚集索引和非聚集索引 1) 我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。 2) 非聚集索引:我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。 但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。 我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。它也许同时有主题索引和作者索引。同样,一个表可以有多个非聚簇索引. 2 防止 SQL 注入的常用方式 ok 1:过滤掉特殊字符用户输入内容中的所有连字符,防止攻击者构造出类如. 2 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行

SQL优化技巧

北战南征 提交于 2019-11-26 21:07:53
现观察线上系统运行发现,线上某些业务查询存在等待时间长问题,后核查发现,部分问题出现在对数据库操作上Cost大部分时间,后根据网上各位前辈提供的优化技巧解决大部分问题,现写下本篇文章,一来巩固加深自己学习的优化技巧,二来方便正在为sql优化迷茫的猿友们提供一下思路和方法,共同进步,一起成长~ 1、现状描述 sql执行时间长、数据查询慢 2、问题对象 sql执行语句(特别是多表多条件关联查询数据) 3、理论知识 1、Oracle优化器 sql优化器:sql数据库中的优化器又叫查询优化器(QueryOptimizer)。它是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。 sql优化器优化方式 基于规则的优化方式(Rule-BasedOptimization,简称为RBO) 它根据指定的规则顺序,对指定的表进行执行计划的选择。它着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的 内容怎样,也不会影响到你的“执行计划”,也就是说RB对数据不“敏感”。要求开发人员了解RBO的各项细则。在sql 10g中完全被CBO取代。 基于代价的优化方式(Cost-Based Optimization,简称为CBO)。 CBO是一种比RBO更加合理、可靠的优化器,它是从sql 8中开始引入,在sql10g中完全取代RBO。CBO是计算各种可能“执行 计划”的“代价”

[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

ε祈祈猫儿з 提交于 2019-11-26 20:33:30
[ 推荐 ] ORACLE PL/SQL 编程之 四 : 把 游标 说透 ( 不怕做不到,只怕想不到 ) 继上 两 篇: ORACLE PL/SQL 编程之八:把触发器说透 ORACLE PL/SQL 编程之六:把过程与函数说透 ( 穷追猛打,把根儿都拔起 !) 得到了大家的强力支持,感谢。接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀 ~ !我也才有动力写后面的。 本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理隐式游标 4.1.3 关于 NO_DATA_FOUND 和 %NOTFOUND 的区别 4.1.4 使用 游标 更新 和删除 数据 4.2 游标变量 4.2.1 声明游标变量 4.2.2 游标变量操作 游标的使用 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实现。 4.1 游标概念 在 PL/SQL 块中执行 SELECT 、 INSERT 、 DELETE 和 UPDATE 语句时, ORACLE 会在内存中为其分配上下文区( Context Area ),即缓冲区。游标是指向该区的一个指针,或是命名一个工作区( Work Area ),或是一种结构化数据类型。它为应用等量齐观提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法,是设计嵌入式 SQL 语句的应用程序的常用编程方式。 在每个用户会话中

Oracle游标练手实例

纵然是瞬间 提交于 2019-11-26 20:32:43
-- 声明游标;CURSOR cursor_name IS select_statement -- For循环游标 -- (1)定义游标 -- (2)定义游标变量 -- (3)使用for循环来使用这个游标 declare -- 类型定义 cursor c_job is select empno,ename,job,sal from emp where job = ' MANAGER ' ; -- 定义一个游标变量v_cinfo c_emp%ROWTYPE,该类型为游标c_emp中的一行数据类型 c_row c_job % rowtype; begin for c_row in c_job loop dbms_output.put_line(c_row.empno || ' - ' || c_row.ename || ' - ' || c_row.job || ' - ' || c_row.sal); end loop; end ; -- Fetch游标 -- 使用的时候必须要明确的打开和关闭 declare -- 类型定义 cursor c_job is select empno,ename,job,sal from emp where job = ' MANAGER ' ; -- 定义一个游标变量 c_row c_job % rowtype; begin open c_job;

SQL SERVER 动态游标

◇◆丶佛笑我妖孽 提交于 2019-11-26 19:02:54
 set @sql = ' select id,content from table ' set @strCursor = ' declare table_cursor cursor scroll dynamic for ' + @sql -- scroll表示可以向前向后 -- dynamic表示可以可读可写 exec ( @strCursor ) open table_cursor 转载于:https://www.cnblogs.com/hubj/archive/2010/07/20/1781456.html 来源: https://blog.csdn.net/weixin_30725315/article/details/99042748

有关T-SQL的10个好习惯【转】

流过昼夜 提交于 2019-11-26 18:34:26
原文: http://www.cnblogs.com/CareySon/archive/2012/10/11/2719598.html 1.在生产环境中不要出现Select * 这一点我想大家已经是比较熟知了,这样的错误相信会犯的人不会太多。但我这里还是要说一下。 不使用Select *的原因主要不是坊间所流传的将*解析成具体的列需要产生消耗,这点消耗在我看来完全可以忽略不计。更主要的原因来自以下两点: 扩展方面的问题 造成额外的书签查找或是由查找变为扫描 扩展方面的问题是当表中添加一个列时,Select *会把这一列也囊括进去,从而造成上面的第二种问题。 而额外的IO这点显而易见,当查找不需要的列时自然会产生不必要的IO,下面我们通过一个非常简单的例子来比较这两种差别,如图1所示。 图1.*带来的不必要的IO 2.声明变量时指定长度 这一点有时候会被人疏忽,因为对于T-SQL来说,如果对于变量不指定长度,则默认的长度会是1.考虑下面这个例子,如图2所示。 图2.不指定变量长度有可能导致丢失数据 3.使用合适的数据类型 合适的数据类型首先是从性能角度考虑,关于这一点,我写过一篇文章详细的介绍过,有兴趣可以阅读: 对于表列数据类型选择的一点思考 ,这里我就不再细说了 不要使用字符串类型存储日期数据,这一点也需要强调一些,有时候你可能需要定义自己的日期格式,但这样做非常不好

Oracle --存储过程基本语法

眉间皱痕 提交于 2019-11-26 16:37:44
一、存储过程的理解 create or replace procedure 存储过程名 as begin null end 行1:create or replace procedure 是一个SQL语句,通知oracle数据库去创建一个叫做skeleton储存过程,如果存在就覆盖它。 行2:as关键词表明后面将跟随一个pl/sql体。 行3:begin关键词表明pl/sql体的开始。 行4:null 表明pl/sql语句什么事情都不做,这句不能删除,因为pl/sql体中至少需要有一句。 行5:end关键词表明pl/sql体的结束。 二、存储过程创建语法 create or replace procedure 存储过程名 (param1 in type,para2 out type) as 变量1 类型(值范围); eg: vs_msg VARCHAR2(20); 变量2 类型(值范围); begin select count(*) into 变量1 from 表A where 列名 = param1; if (判断条件) then select 列名 into 变量2 from 表A where 列名=param1; dbms_output.put_line('打印信息'); elseif (判断条件) then dbms_output.putline('打印信息'); else

MySQL存储过程02

旧巷老猫 提交于 2019-11-26 13:29:53
这次接着说MySQL存储过程: 我们先看它的多分支控制结构case: case的语句很简单: case 变量名 when 条件1 then 输出结果1; when 条件2 then 输出结果2; ...... end case; 那我们就来建立一个存储过程实现它: create procedure p10() begin declare pos int default 0; set pos:= floor(5*rand()); case pos when 1 then select'我会飞'; when 2 then select'我掉到海里'; when 3 then select'我在小岛'; else select'我不知道我在哪'; end case; end$ 由于我们设置的是随机数,所以它会根据我们生成的数来输出结果 接着看一下repeat循环: repeat的语法: repeat sql statement; sql statement; ... until condition end repeat; create procedure p11() begin declare total int default 0; declare i int default 0; repeat set i:=i+1; set total:=total+i; until i>=100