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

Oracle Pl SQL游标中存储的数据是动态的还是静态的?,oracle,plsql,cursor,Oracle,Plsql,Cursor,当一个游标被声明时,它是一个静态数据集还是在它被声明之后,如果在开始循环之前输入了一个新的数据,它是否会为循环拾取 声明游标使用名称和关联的SELECT语句定义游标。声明游标后,需要打开游标为游标分配内存,并准备将SQL语句返回的行提取到游标中。例如: 声明游标 游标c_客户是 从客户中选择id、姓名、地址 打开光标 开放式客户 打开后,您可以通过提取光标一次访问一行: 将c_客户输入c_id、c_名称、c_地址 获取光标后,只需关闭光标: 关闭客户 因此它不会被循环拾取。声明游标将使用名称和关

当一个游标被声明时,它是一个静态数据集还是在它被声明之后,如果在开始循环之前输入了一个新的数据,它是否会为循环拾取

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

声明游标 游标c_客户是 从客户中选择id、姓名、地址

打开光标 开放式客户

打开后,您可以通过提取光标一次访问一行: 将c_客户输入c_id、c_名称、c_地址

获取光标后,只需关闭光标: 关闭客户


因此它不会被循环拾取。

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

声明游标 游标c_客户是 从客户中选择id、姓名、地址

打开光标 开放式客户

打开后,您可以通过提取光标一次访问一行: 将c_客户输入c_id、c_名称、c_地址

获取光标后,只需关闭光标: 关闭客户

因此,它不会被循环拾取。

Oracle提供,这保证了单个查询返回的数据在查询开始时提交并保持一致

事务隔离级别、闪回查询和执行查询的用户定义函数都有一些细节,但一般来说,一旦查询按过程启动,当光标打开时,无论是否提交了任何数据更改,其结果都将是真实的。

Oracle提供,这保证了单个查询返回的数据在查询开始时提交并保持一致


有一些细节与事务隔离级别、闪回查询和执行查询的用户定义函数有关,但一般来说,一旦查询以过程方式启动,当光标打开时,其结果将与当时一样为真,无论是否提交任何数据更改。

我在mysql中尝试过,在mysql中它正在获取数据。 我创建了一个新表并编写了一个过程。此过程在新创建的空表中插入两条记录,打开游标并选择record_cnt变量中的FOUND_ROWS。 FOUND_ROWS提供游标获取的行数。在Oracle中,它是游标名称%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 |
+------+

我在mysql中尝试过,在mysql中它正在获取数据。 我创建了一个新表并编写了一个过程。此过程在新创建的空表中插入两条记录,打开游标并选择record_cnt变量中的FOUND_ROWS。 FOUND_ROWS提供游标获取的行数。在Oracle中,它是游标名称%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 |
+------+

我认为如果在调用OPEN cursor_name;,之前提交了数据;,它也将拾取这些数据。光标只分配空间。它没有数据集。它包含您为其打开的查询的数据集。因此数据是在运行时提取的,对吗?这意味着,如果在打开游标和声明游标的时间范围内包含新数据,它将获取新数据row@Optimuskck. 否,一旦游标打开,如果查询在分配给它的空间中,它将获得结果集。它就像一张光标表。如果对表进行更改,则不会影响光标结果集中的结果集。是的,数据是在运行时提取的。否,它将不包括在光标打开后应用的更改。它在光标打开时获取行。在没有显式游标处理增加复杂性的简单SQL术语中,如果报表运行一小时,结果将不会反映在该小时内所做的任何更改。我认为如果在调用OPEN cursor_name;之前提交数据;,它也将拾取这些数据。光标只分配空间。它没有数据集。它包含您为其打开的查询的数据集。因此数据是在运行时提取的,对吗?这意味着,如果在打开游标和声明游标的时间范围内包含新数据,它将获取新数据row@Optimuskck. 否,一旦游标打开,如果查询在分配给它的空间中,它将获得结果集。它就像一张光标表。如果对表进行更改,则不会影响t中的结果集
光标结果集,是的,数据是在运行时获取的。否,它将不包括在光标打开后应用的更改。它在光标打开时获取行。在没有显式游标处理增加复杂性的简单SQL术语中,如果报表运行一个小时,结果将不会反映在该小时内所做的任何更改。正确的,您可以将游标视为以后执行内容的定义。打开光标的时刻正是数据集有效的时刻。您可以随时从光标读取数据。它返回的数据将始终表示开始时间的情况。在其他会话中修改数据时,如果等待时间太长,则可能会出现一个快照以显示旧错误。。这样看:打开时,它会拍摄当前情况的快照。在关闭光标之前,此快照将一直有效。其他会话中的数据修改对您不可见。确实,数据修改将不可见。正确,您可以将光标视为稍后执行的内容的定义。打开光标的时刻正是数据集有效的时刻。您可以随时从光标读取数据。它返回的数据将始终表示开始时间的情况。在其他会话中修改数据时,如果等待时间太长,则可能会出现一个快照以显示旧错误。。这样看:打开时,它会拍摄当前情况的快照。在关闭光标之前,此快照将一直有效。其他会话中的数据修改对您不可见。确实,数据修改将不可见。我的情况是,您在打开光标后但在select语句之前向表中输入记录。在同一会话或不同会话中,在这种情况下,它将不可用。我的场景是,在打开光标后,但在select语句之前,将记录输入到表中。无论是在同一会话中还是在不同会话中,在这种情况下都将不可用。