cursor


http://blog.163.com/digoal@126/blog/static/163877040201111694355822/

游标使用注意点:

分页:http://blog.163.com/digoal@126/blog/static/163877040201111694355822/
使用分页的话,如果使用limit...offset..则会每次都要计算时长执行select语句,
如果使用move cursor的话,则不需要每次都执行select。会省去不少时间。

参数解释:
http://www.postgresql.org/docs/9.3/static/sql-declare.html

DECLARE name [ BINARY ] [ INSENSITIVE ] [ [ NO ] SCROLL ] CURSOR [ { WITH | WITHOUT } HOLD ] FOR query

BINARY:默认是text,不是二进制
INSENSITIVE:(不敏感)默认是INSENSITIVE,只有在对游标的SQL使用
for update/for share的时候才会自动将其改为SENSITIVE(敏感)。
SENSITIVE即就是会及时反映出外部DML操作对记录的更改。
INSENSITIVE不能跟for update一起使用,会出错。
for update会锁住相应已经获取到的行,如果另一个session更新相应行,则会等待这个锁。
如果想使用cursor进行更新数据则游标最好使用for update

If the cursor's query includes FOR UPDATE or FOR SHARE, then returned rows are locked at the time they are first fetched, in the same way as for a regular SELECT command with these options. In addition, the returned rows will be the most up-to-date versions; therefore these options provide the equivalent of what the SQL standard calls a "sensitive cursor". (Specifying INSENSITIVE together with FOR UPDATE or FOR SHARE is an error.)

SCROLL:默认是SCROLL。for update之后会将其改为NO SCROLL。
WITH HOLD:定义之后在SESSION中有效。WITHOUT HOLD定以后在transaction中有效。
FETCH操作cursor:
http://www.postgresql.org/docs/9.3/static/sql-fetch.html

FETCH [ direction [ FROM | IN ] ] cursor_name where direction can be empty or one of: NEXT PRIOR FIRST LAST ABSOLUTE count RELATIVE count count ALL FORWARD FORWARD count FORWARD ALL BACKWARD BACKWARD count BACKWARD ALL

move操作cursor:
http://www.postgresql.org/docs/9.3/static/sql-move.html

MOVE [ direction [ FROM | IN ] ] cursor_name where direction can be empty or one of: NEXT PRIOR FIRST LAST ABSOLUTE count RELATIVE count count ALL FORWARD FORWARD count FORWARD ALL BACKWARD BACKWARD count BACKWARD ALL

DML操作cursor:
begin;
declare c cursor for select * from aa for update;
update aa set b='xxxxxxxx' where current of c;
end;



函数返回row
http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html
digoal=# CREATE TABLE foo (fooid INT, foosubid INT, fooname TEXT);
CREATE TABLE
digoal=# INSERT INTO foo VALUES (1, 2, 'three');
INSERT 0 1
digoal=# INSERT INTO foo VALUES (4, 5, 'six');
INSERT 0 1
digoal=# CREATE OR REPLACE FUNCTION get_all_foo() RETURNS SETOF foo AS
digoal-# $BODY$
digoal$# DECLARE
digoal$#     r foo%rowtype;
digoal$# BEGIN
digoal$#     FOR r IN
digoal$#         SELECT * FROM foo WHERE fooid > 0
digoal$#     LOOP
digoal$#         -- can do some processing here
digoal$#         RETURN NEXT r; -- return current row of SELECT
digoal$#     END LOOP;
digoal$#     RETURN;
digoal$# END
digoal$# $BODY$
digoal-# LANGUAGE plpgsql;
CREATE FUNCTION

digoal=# select * from aa where a in (select fooid from get_all_foo()); 
 a |         b         
---+-------------------
 4 | 0.949729613494128
 1 | mm
(2 rows)




 

转载于:https://www.cnblogs.com/xxvv/p/3766270.html

06-02
### Cursor 的定义和用法 在编程和数据库领域中,Cursor 是一个重要的概念。以下是关于 Cursor 在不同上下文中的定义和用法。 #### 1. Cursor数据库中的定义和用法 在数据库中,Cursor 是一种用于遍历查询结果集的机制。它允许逐行访问查询返回的结果集,而不是一次性将所有数据加载到内存中。这种特性对于处理大量数据或需要逐行操作的情况非常有用[^1]。 - **MySQL 中的 Cursor 模拟** MySQL 数据库本身并不直接支持游标(Cursor),但可以通过 Python 的 `MySQLdb` 库来模拟游标的使用。具体来说,`MySQLdb` 提供了一个 `cursor()` 方法,该方法可以从连接对象中获取一个游标对象。这个游标对象可以用来执行 SQL 查询并逐行处理结果[^1]。 示例代码如下: ```python import MySQLdb # 创建数据库连接 connection = MySQLdb.connect(host="localhost", user="user", passwd="password", db="database") # 获取游标对象 cursor = connection.cursor() # 执行查询 cursor.execute("SELECT * FROM EMPLOYEE") # 遍历结果集 for row in cursor.fetchall(): print(row) # 关闭游标和连接 cursor.close() connection.close() ``` - **Oracle 和其他数据库中的游标** 在 Oracle 等支持游标的数据库中,可以直接通过存储过程或 PL/SQL 脚本来定义和使用游标。例如,引用中的 `getEmployeeByRole` 存储过程展示了如何使用游标来返回动态查询结果[^2]。 示例代码如下: ```sql CREATE OR REPLACE PROCEDURE getEmployeeByRole ( in_role IN EMPLOYEE.ROLE%TYPE, out_cursor_emps OUT SYS_REFCURSOR ) AS BEGIN OPEN out_cursor_emps FOR SELECT EMPID, NAME, CITY, COUNTRY FROM EMPLOYEE WHERE ROLE = in_role; END; ``` #### 2. Cursor 在编程语言中的定义和用法 在编程语言中,Cursor 通常指代一种指针或迭代器,用于跟踪数据结构中的当前位置。例如,在图形界面开发中,Cursor 可能指的是鼠标指针;而在文件操作中,Cursor 则可能表示文件读写位置的指针。 - **Python 中的 Cursor 对象** 在 Python 的数据库接口规范(DB-API)中,Cursor 对象是执行 SQL 命令和提取查询结果的核心工具。通过 `connection.cursor()` 方法创建的 Cursor 对象提供了诸如 `execute()`、`fetchone()` 和 `fetchall()` 等方法,用于与数据库交互[^1]。 #### 3. 游标的优缺点 - **优点**:游标允许逐行处理查询结果,适合需要对每行数据进行复杂操作的场景。 - **缺点**:游标的使用可能会导致性能问题,特别是在处理大规模数据集时,因为每次提取一行数据都会涉及额外的网络开销。 ### 总结 Cursor 是一种用于遍历和操作数据的强大工具,无论是数据库环境还是编程语言中都有其独特的应用场景。在数据库中,游标可以用来逐行处理查询结果;在编程语言中,游标则更多地表现为指针或迭代器的概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值