当游标声明时,它是一个静态数据集,还是在声明之后,如果一个新数据在开始循环之前输入,它会为循环选择还是不选?
发布于 2017-07-03 07:37:26
声明游标使用名称和关联的SELECT语句定义游标。声明游标之后,您需要打开游标来为游标分配内存,并使其能够将SQL语句返回的行提取到游标中。例如:
所以它不会被循环所捕获。
发布于 2017-07-03 09:07:43
Oracle提供了语句级读取一致性,它保证单个查询返回的数据与查询开始时一样被提交并保持一致。
有一些细节与事务隔离级别、闪回查询和执行查询的用户定义函数有关,但通常情况下,一旦查询已经启动(从过程上讲,当游标被打开时),它的结果到那时将是真实的,而不管是否有任何数据更改(提交或其他)。
发布于 2017-07-03 09:32:31
我在mysql中尝试过,在mysql中,它正在获取数据。
我创建了一个新的表格并编写了一个程序。此过程在新创建的空表中插入两个记录,打开游标,并在FOUND_ROWS()变量中选择record_cnt。
FOUND_ROWS()提供游标获取的行的计数。在甲骨文中,它是cursor_name%ROWCOUNT。
在Oracle中,肯定会有其他的语法差异,但我认为如果在打开游标之前插入并提交这些值,则行为将是相同的,并且值对游标是可见的。
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 |
+------+https://stackoverflow.com/questions/44879909
复制相似问题