首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储在Pl-SQL游标中的数据是动态的还是静态的?

存储在Pl-SQL游标中的数据是动态的还是静态的?
EN

Stack Overflow用户
提问于 2017-07-03 07:25:03
回答 3查看 851关注 0票数 1

当游标声明时,它是一个静态数据集,还是在声明之后,如果一个新数据在开始循环之前输入,它会为循环选择还是不选?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-03 07:37:26

声明游标使用名称和关联的SELECT语句定义游标。声明游标之后,您需要打开游标来为游标分配内存,并使其能够将SQL语句返回的行提取到游标中。例如:

  1. 声明光标游标c_customers是选择id,名称,地址从客户;
  2. 打开光标,打开c_customers;
  3. 打开后,您可以通过获取游标一次访问一行:将c_customers提取到c_id、c_name、c_addr;
  4. 获取游标后,只需关闭游标:关闭c_customers;

所以它不会被循环所捕获。

票数 2
EN

Stack Overflow用户

发布于 2017-07-03 09:07:43

Oracle提供了语句级读取一致性,它保证单个查询返回的数据与查询开始时一样被提交并保持一致。

有一些细节与事务隔离级别、闪回查询和执行查询的用户定义函数有关,但通常情况下,一旦查询已经启动(从过程上讲,当游标被打开时),它的结果到那时将是真实的,而不管是否有任何数据更改(提交或其他)。

票数 1
EN

Stack Overflow用户

发布于 2017-07-03 09:32:31

我在mysql中尝试过,在mysql中,它正在获取数据。

我创建了一个新的表格并编写了一个程序。此过程在新创建的空表中插入两个记录,打开游标,并在FOUND_ROWS()变量中选择record_cnt

FOUND_ROWS()提供游标获取的行的计数。在甲骨文中,它是cursor_name%ROWCOUNT

在Oracle中,肯定会有其他的语法差异,但我认为如果在打开游标之前插入并提交这些值,则行为将是相同的,并且值对游标是可见的。

代码语言:javascript
复制
CREATE TABLE my_tab(id int);

DELIMITER $$
CREATE PROCEDURE cursor_test(OUT record_cnt INT)
 BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE cur1 CURSOR FOR SELECT * FROM my_tab;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  INSERT INTO my_tab VALUES(1),(2);
  COMMIT;
  OPEN cur1;
  SELECT FOUND_ROWS() INTO record_cnt;
  CLOSE cur1;
END$$
DELIMITER ;

CALL cursor_test(@rec);

select @rec;
+------+
| @rec |
+------+
|    2 |
+------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44879909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档