天道酬勤,学无止境

是否可以比较两个游标?(Is it possible to compare two cursors?)

问题

我需要检查两个游标是否指向具有相同值的相同行。 是否可以?

更多细节:

  1. 我正在从我自己的ContentProvider加载数据
  2. 我正在向服务器发送请求,然后使用新值更新ContentProvider中的数据。
  3. 如果值更改 - 我需要通知用户他可以更新数据。
回答1

根据 CommonsWare 删除的答案:

遍历 Cursor 中的相关列,检索值并比较每个值。

虽然您可能事先不知道每列的类型,但您可以通过Cursor.getType()找到。 您还可以使用Cursor.getColumnNames()获取每列的名称和列数。

此信息将允许您使用正确的访问器方法来获取每个值并进行比较。

回答2

在 SQLite 中,行没有与其列值分开的标识(但ROWID是这些值之一)。

你想要的要求你的数据有一些唯一的列作为游标的一部分,要么是ROWID ,要么是其他一些保证没有重复的键值。

否则,您永远无法知道您所看到的是否只是在这些列中恰好具有相同值的两条记录。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • SQL:按记录比较两个表记录(SQL: compare two table record by record)
    问题 我想按记录比较两个表。 每个表我有两个光标。 代码看起来像这样 Declare Cursor c1 for SELECT * from Table1 OPEN c1 While @@Fetch_status=0 Begin Declare Cursor c2 for SELECT * from Table2 OPEN c2 WHILE @@Fetch_Status=0 Begin /*Comparison happens here*/ END END 处理时,我是否必须指定要获取的游标以及如何执行此操作? 编辑 对于表 1 中的每条记录,我想 根据主键在 Table2 中搜索该记录。 找到后,我想根据 table1 中的列的值更新 Table2 中的额外列值。 当 table2 中缺少此记录时,我想将它从 table1 复制到 table2 并设置 table2 中额外列的默认值。 对其他解决方案开放(不限于游标) 回答1 如果表有相同的列定义,fastes 方法就是使用 'except' 子句: SELECT * from Table1 except SELECT * from Table2 也以相反的方式运行它: SELECT * from Table2 except SELECT * from Table1 您将看到确切的设置差异: EXCEPT 和 INTERSECT
  • 在 SQL 中使用单个游标比较两行(Compare two rows using a single cursor in SQL)
    问题 我有下表 +-------+-------+----------+------+ | icode | iname | icatcode | slno | +-------+-------+----------+------+ | 10 | a | 11 | 0 | | 20 | b | 31 | 0 | | 30 | c | 11 | 0 | | 40 | d | 21 | 0 | | 50 | e | 31 | 0 | | 60 | f | 11 | 0 | | 70 | g | 21 | 0 | | 80 | h | 41 | 0 | +-------+-------+----------+------+ 我需要使用游标更新slno列。 的O / P应为以下表即,当icatcode是相同应该递增slno并且当icatcode改变它应该的slno设置为1。 +-------+-------+----------+------+ | icode | iname | icatcode | slno | +-------+-------+----------+------+ | 10 | a | 11 | 1 | | 30 | b | 11 | 2 | | 60 | c | 11 | 3 | | 70 | d | 21 | 1 | | 40 | e | 21 | 2 | | 50
  • 是否可以在 Pymongo 中创建一个没有光标超时的聚合?(Is it possible to create an aggregation in Pymongo with no timeout for the cursor?)
    问题 聚合看起来像: res = Things.objects._collection.aggregate(pipeline, allowDiskUse=True, batchSize=101, noCursorTimeout=True ) 并失败 OperationFailure:无法识别的字段“noCursorTimeout” 从 Pymongo 文档中可以看出 no_cursor_timeout 可以与 find() 一起使用,但是我一直没有成功为聚合 () 找到可比较的 **kwargs。 我不想使用 setParameter 或 maxTimeMS。 更新: 来自 MongoDB 的 Jira 站点:SERVER-15042 OP_QUERY 标头中的 NoCursorTimeout 位可防止服务器关闭闲置时间超过 10 分钟的游标。 如果客户端处理一批结果的时间可能超过 10 分钟,则可以设置此位。 “aggregate”和“parallelCollectionScan”命令也应该允许客户端关闭游标超时。 对这张票的回应是: 我们故意不支持 noCursorTimeout。 当我们实现游标保持活动时,需要这样做的理由将消失。 该工作将在 SERVER-6036 中进行跟踪。 查看 SERVER-6036: 更新时间:2016 年 9 月 14 日下午 03:53:05
  • 常见排序方法总结和C#实现
    排序往往会用到循环或者递归,对于循环和递归,第一步分析并实现循环或递归的情况(需要多少层循环,每一层循环的起始点分别是什么;是否使用递归,递归怎么分解),第二步分析在最内层循环或递归终止条件中每一步操作会遇到几种情况,然后分情况去实现。一.冒泡排序动图: 分析:冒泡排序将数据分为已排序区和未排序区,每次在未排序区中依次遍历,判断相邻两个的大小看是否需要交换,这样当前未排序区中的最大或最小值就能不断移动,最后遍历完成当前最值也移动到了未排序区和已排序区中间,然后更新未排序去和已排序区。冒泡排序分为两层循环,外层循环i从0号到n-1号进行遍历,n-i就是未排序区和已排序区分界位置,内层循环j从0号到n-i-2号,遍历未排序区,每次循环都判断相邻的j号和j+1号的大小,根据大小有两种情况,一种交换一种不交换。实现: /// /// 冒泡排序 /// /// 待排序的数组 static void Sort1(ref int[] n) { //是否结束循环的标签,如果一次遍历下来都没有发生数字交换,说明数字已经排好序了 //每次进入外层循环中,将初始值置为true,一旦发生数字交换将值同时置为false bool end; //双重循环 //外层0=>length-2,内层0=>length-2-i //依次遍历,将相邻的两个值进行比较,如果大小不合适就交换 for (int i = 0
  • 库缓存(Library Cache)内存结构
    库缓存(Library Cache)内存结构Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分. 一 , Library cache存放什么(存放的信息单元都叫做对象) ? Library存放的信息单元都叫做对象,这些对象可以分为两类: 1. 存储对象 2. 过渡对象(游标Cursor,这里的游标指生成的可执行的对象, 运行相同SQL的多个进程可以共享该SQL产生的游标,节省内存。)A. 用户提交的SQL B. SQL语句相关的解析树 C. 执行计划 D. 用户提交的PL/SQL程序块(包括匿名程序块,procedure,packages,function等) E. PL/SQL对象依赖的table,index,view等对象 F. 控制结构:lock,pin,dependency table 等备注: LIBRARY CACHE的对象可以在V$DB_OBJECT_CACHE中找到,这个视图基于X$KGLOB。二, SQL的解析及游标SQL在解析阶段主要完成以下步骤 : 1. 将父游标保存到Library Cache中 (父游标的概念参考后面的说明,这一步其实不包含 在解析过程中) 先将SQL转化为ASCII数值,然后对这些ASCII数值进行hash函数的运算生成hash value (10g还有唯一的SQL_ID)
  • SQL Server 中游标的用途是什么?(What is the use of a cursor in SQL Server?)
    问题 我想使用数据库游标; 首先我需要了解它的用途和语法是什么,在什么情况下我们可以在存储过程中使用它? 不同版本的 SQL Server 是否有不同的语法? 什么时候需要使用? 回答1 游标是一种显式枚举结果集的行的机制,而不是这样检索它。 然而,虽然对于习惯于编写While Not RS.EOF Do ...程序员来说,它们可能更适合使用,但如果可能的话,它们通常是 SQL Server 存储过程中应避免的事情——如果您可以编写查询如果不使用游标,优化器就有更好的机会找到实现它的快速方法。 老实说,除了一些管理任务(例如遍历目录中的所有索引并重建它们)之外,我从未发现过一个无法避免的游标的实际用例。 我想它们可能在报告生成或邮件合并中有一些用途,但在与数据库对话的应用程序中执行类似游标的工作可能更有效,让数据库引擎做它最擅长的事情 - 设置操作。 回答2 使用游标是因为在子查询中我们可以逐行获取记录,所以我们使用游标来获取记录 光标示例: DECLARE @eName varchar(50), @job varchar(50) DECLARE MynewCursor CURSOR -- Declare cursor name FOR Select eName, job FROM emp where deptno =10 OPEN MynewCursor -- open the
  • C# 2 组排序数字的最快交集(C# fastest intersection of 2 sets of sorted numbers)
    问题 我正在计算我的应用程序的时间关键部分中的两组排序数字的交集。 这个计算是整个应用的最大瓶颈,所以我需要加快速度。 我已经尝试了一堆简单的选项,目前正在使用这个: foreach (var index in firstSet) { if (secondSet.BinarySearch(index) < 0) continue; //do stuff } firstSet和secondSet都是 List 类型。 我也试过使用 LINQ: var intersection = firstSet.Where(t => secondSet.BinarySearch(t) >= 0).ToList(); 然后循环通过intersection 。 但是当这两个集合都被排序时,我觉得有一个更好的方法来做到这一点。 请注意,我无法从集合中删除项目以使它们变小。 两组通常各包含约 50 个项目。 请帮助我,因为我没有很多时间来完成这件事。 谢谢。 注意:我这样做了大约 530 万次。 所以每一微秒都很重要。 回答1 如果你有两个都排序的集合,你可以实现比 LINQ 开箱即用的任何东西更快的交集。 基本上,保持两个IEnumerator<T>游标打开,每个游标一个。 在任何时候,以较小的值前进。 如果它们在任何时候匹配,则将它们都推进,依此类推,直到到达任一迭代器的末尾。
  • Oracle PL/SQL 在游标中创建表?(Oracle PL/SQL Creating tables in cursor?)
    问题 我对 PL/SQL 比较陌生,所以请耐心等待。 我正在创建两个将在 FOR 循环游标中使用的表。 我的目的是在开始时(在游标循环之前)创建这两个表,在需要清除游标循环时将它们截断并插入新值,然后在游标循环完成后将它们删除。 (在查看了 SO 之后,我认为这可以用 REF CURSOR 来完成,但我不太清楚如何使用它,所以我决定继续使用第一种方法。) 我尝试在 DECLARE 部分中创建表,然后在循环开始之前在 BEGIN 部​​分中创建表,但它引发了错误“ORA-065500 和 PLS-00103 遇到符号 CREATE 当期望开始函数编译时......”请注意,我是在 LOOP 结束之后但在游标的 END 部分之前删除表。 我应该在游标外创建表,在 DECLARE 部分之前,并在游标 END 部分之后删除它们吗? 我认为应该可以在游标内创建永久的 oracle 表? 更新:在此处发布代码- 1) DECLARE CREATE TABLE T1 ( col1 VARCHAR2(128), col2 VARCHAR2(128), col3 NUMBER(3) NOT NULL, col3 FLOAT(100) ); CREATE TABLE T2 AS SELECT * FROM other_table WHERE 1 = 0; CURSOR CUR IS ... BEGIN
  • SQL语句的处理过程
    1、检查是否有打开的游标,如果有,则直接通过游标link到位于PGA的private SQL AREA( private SQL area),转步骤11。否则,执行步骤2。2、检查初始化参数SESSION_CACHED_CURSORS是否被设置,如果被设置,则同样可以通过游标指向到位于PGA的私有SQL AREA,转步骤11。否则执行步骤3。3、检查HOLD_CURSOR以及RELEASE_CURSOR的设置。如果RELEASE_CURSOR=no(默认no),HOLD_CURSOR=yes(默认为no),当ORACLE执行完SQL语句,为private SQL AREA分配的内存空间被保留,cursor和private SQL AREA之间的link也被保留,预编译程序不再使用它,同样可以通过这个指针直接在private SQL AREA获得语句,转步骤11。这上面的三种情况,实际上都没有作任何parse,都是直接从位于PGA中的private SQL AREA获得语句并直接执行。此为fast parse。这三种情况都不存在的情况下,oracle转到步骤4执行。4、创建一个游标。5、语法检查Syntax Check:检查语法书写是否正确,是否符合SQL Reference Manual中给出的SQL语法。6、语义分析Semantic Analysis:查找数据字典,检查表
  • Android MediaStore 通过与 TITLE_KEY 进行比较来获取光标位置(Android MediaStore get cursor position by comparing with TITLE_KEY)
    问题 我正在使用 MediaStore 的媒体内容并有一个 SearchView 来过滤列表片段中显示的内容。 当查询字符串为空(这意味着所有行)时,我保留对游标( mainCursor )的引用当用户搜索时,我根据查询获得新游标 根据我的理解(我对 Cursor、DB 和 Contentprovider 很陌生),光标将包含与查询匹配的所有行,要查询的列是MediaStore.Audio.Media.TITLE ,因此我可以在列表中看到匹配的标题。 public void doQuery(String query) { // TODO Auto-generated method stub Log.e(TAG,"inside doQuery: "+query); String search = MediaStore.Audio.Media.TITLE + " LIKE '%" + query + "%'"; Cursor cursorNew = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,columns, search , null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); sendBroadcast(new Intent
  • 批量查询分页? 是否可以从数据存储批量获取并获取游标?(Pagination with batch queries? Is it possible to batch gets from the datastore and get a cursor?)
    问题 我目前正在从数据存储中请求 20 个条目,使用游标将这些条目返回给用户,如果用户要求更多条目,请使用游标作为新的开始并请求接下来的 20 个条目。 代码看起来像 q := datastore.NewQuery("Item"). Limit(limit) if cursor, err := datastore.DecodeCursor(cursor); err == nil { q = q.Start(cursor) } var is []Item t := q.Run(c) for { var i Item _, err := t.Next(&i) if err == datastore.Done { break } is = append(is, i) } 如果重要的是这里是完整的代码:https://github.com/koffeinsource/kaffeeshare/blob/master/data/appengine.go#L23 使用带有append的循环看起来是一种反模式,但是在使用GetMulti / GetAll时我看不到获取光标的方法,还是我遗漏了什么? 我确实希望在用户查询数据存储时添加数据,因此偏移量可能会产生重复的结果。 在这种情况下,我应该关心批处理吗? 回答1 您的方法非常好,事实上,它是 AppEngine 上的最佳方法。 如果插入新记录
  • 是否可以在 IndexedDb 事务期间将对象写入文件?(Is it possible to write objects to a file during an IndexedDb transaction?)
    问题 我有一个 objectStore,里面有数百个对象,我可以用这样的代码查看: db // already set by call to window.indexedDB.open .transaction(["mailing-list"]) .objectStore("mailing-list") .openCursor() .onsuccess = function (event) { var cursor = event.target.result; if (cursor) { console.log(cursor.value); cursor.continue(); } }; 我想要做的是使用 FileWriter 在检索时写出每个对象; 我不想将所有对象累积在一个巨大的数组中并一次将它们全部写出。 我也不想为每个对象启动一个单独的事务,因为我想使用游标来遍历所有对象。 (不关心他们的钥匙。) 我会把对 fileWriter.write 的调用放在现在调用 console.log 的地方。 对 cursor.continue() 的调用将在 onwrite 回调中。 否则,我会在前一个完成之前发出写入,这是非法的。 这似乎是不可能的,因为由于写入是异步的,“onsuccess”回调将在 write 被调用后返回,从而结束事务并使游标无效,即使它在闭包中被捕获。
  • SQL Server中使用游标变量的优点(声明@cn游标)(Advantages on using cursor variable in SQL Server (declare @cn cursor))
    问题 在 T-SQL 中,可以通过两种方式声明游标(我知道): declare CursorName cursor for ... declare @CursorName cursor 我正在运行一些测试,我注意到创建游标变量不会向sp_cursor_list的结果添加条目。 从性能、资源利用率等角度来看,使用第二种方法有什么优势/劣势吗? PS:我知道潜在的游标性能问题。 我不是要求比较游标与基于集合的比较。 或带有临时/表变量的游标与while 。 回答1 从我读到的游标变量的目的是能够将它用作存储过程中的输出变量,从而使您能够将游标中的数据发送到另一个控制过程。 我没有尝试过这个,所以我不知道它是如何工作的,但这就是我从在线阅读书籍中得到的。 如果有任何可测量的性能差异,我会感到惊讶,当然不是一开始不使用游标可以获得的改进。 如果您不打算将其用作输出变量,我建议使用更常见的游标定义可能会使代码更易于维护。 也就是说,实际上需要游标的情况非常非常少。 回答2 使用我刚刚发现的DECLARE @local_variable CURSOR语法还有另一个优势。 当一个存储过程调用另一个存储过程并且两个过程同时打开游标时,就会产生优势。 如果DECLARE cursor_name CURSOR用于定义游标,并且两个过程使用相同的 cursor_name,那么您将得到 消息 16915
  • 使用 Python 比较两个 sqlite 数据库(Comparing two sqlite databases using Python)
    问题 我是 Python 新手。 我正在尝试比较两个具有相同架构的 sqlite 数据库。 两个数据库中的表结构也相同,但数据不同。 我想从两个数据库中的两个表中提取行,这些db1.fdetail或db2.fdetail中都不存在 DB1 - Table - fdetail id name key 1 A k1 2 B K2 3 C K3 DB2 - Table - fdetail id name keyid 1 A k1 2 D K4 3 E K5 4 F K6 预期产出 id name keyid 1 B k2 2 C K3 3 D K4 4 E K5 5 F K6 我的代码是 import sqlite3 db1 = r"C:\Users\X\Documents\sqlitedb\db1.db" db2 = r"C:\Users\X\Documents\sqlitedb\db2.db" tblCmp = "SELECT * FROM fdetail order by id" conn1 = sqlite3.connect(db1) conn2 = sqlite3.connect(db2) cursor1 = conn1.cursor() result1 = cursor1.execute(tblCmp) res1 = result1.fetchall() cursor2 =
  • SQLSEVER游标
    SQLSEVER游标 一、什么游标 1、 游标的本质是将查询的结果存起来,然后可以一条一条的操作这些数据(不需使用sql中的循环和where条件,而是使用游标中自带的函数就可以一条一条的操作),select查询出的结果如果要一条一条的操作这些数据,就必须要使用while循环和where 条件,而且要有一个不重复的字段最后这个字段还是int类型的这个才可以一条一条的循环操作,而游标就不必这样处理; 2.、如果要多次处理这些存起来的数据,select就得用一次写一次这个个查询语句,而游标配合while就直接使用就可以了不必再次写查询语句 (每一个游标都会有一个名字,使用的时候直接使用open 游标名进行操作), 所以游标和select查询是有区别的。 3、 使用游标和select 对比优缺点 游标select对比√多次使用,不用重复写查询语句。√能够不用使用 where 和while 就一条一条的操作数据。√放入内存中,当数据量较大是占用内存做。√批量操作查询数据。 二、游标分类 1、静态游标: __在获取完来源表数据后,游标中的数据是固定的不会改变,就算来源表中的数据发生了改变,游标中的数据也保持原来的数据不变,除非重新获取数据。 2、动态游标: __获取完数据后,当来源表的数据发生变化,游标中的数据也随之发生改变。 SQLsever中创建游标默认是动态游标
  • 我可以将显式游标传递给函数/过程以在 FOR 循环中使用吗?(Can I pass an explicit cursor to a function/procedure for use in FOR loop?)
    问题 我有一个过程可以对游标返回的所有记录执行一些计算。 它看起来有点像这样: PROCEDURE do_calc(id table.id_column%TYPE) IS CURSOR c IS SELECT col1, col2, col3 FROM table WHERE ...; BEGIN FOR r IN c LOOP -- do some complicated calculations using r.col1, r.col2, r.col3 etc. END LOOP; END; 现在,我需要对来自不同表的不同记录集执行完全相同的计算。 但是,它们具有与上面示例中相同的“形状”。 是否可以编写如下所示的程序: PROCEDURE do_calc2(c some_cursor_type) IS BEGIN FOR r IN c LOOP -- do the calc, knowing we have r.col1, r.col2, r.col3, etc. END LOOP; END; 我知道SYS_REFCURSOR ,但我想知道是否可以使用更方便的FOR ... LOOP语法和隐式记录类型。 回答1 创建一个包。 将光标声明为包变量。 使用%rowtype设置函数参数类型。 create or replace package test is cursor c is
  • 是否可以在 nodejs 中倒带文件描述符游标?(Is it possible to rewind a file descriptor cursor in nodejs?)
    问题 这就是我在完美世界中会做的事情: fs.open('somepath', 'r+', function(err, fd) { fs.write(fd, 'somedata', function(err, written, string) { fs.rewind(fd, 0) //this doesn't exist }) }) 这是我目前的实现: return async.waterfall([ function(next) { //opening a file descriptor to write some data return fs.open('somepath', 'w+', next) }, function(fd, next) { //writing the data return fs.write(fd, 'somedata', function(err, written, string) { return next(null, fd) }) }, function(fd, next) { //closing the file descriptor return fs.close(fd, next) }, function(next) { //open again to reset cursor position return fs.open(
  • 如何将三个查询合二为一。 是否可以组合它们并编写一个游标?(How to combine three queries into one. Is it possible to combine them and write one cursor?)
    问题 除了非常基本的查询之外,我没有太多机会编写 SQL 查询。 我现在有一个使用三个不同查询的需求。 我想知道这三个查询是否可以合并为一个查询(或一个游标)并使其运行得更好/更快、更高效。 由于我是编写 SQL 查询的新手,因此我可能没有使用推荐的标准。 请随时发表评论/更正。 以下是我正在处理的查询: --Main Query Select DTL.DetailId , HDR.PersonId , ODT.OrderNumber from CMPN.Header HDR INNER JOIN CMPN.Detail DTL ON HDR.HeaderId = DTL.HeaderId INNER JOIN CMPN.DetailStatus DST ON DTL.DetailId = DST.DetailId INNER JOIN CMPN.OperationalDetail ODT ON DTL.DetailId = ODT.DetailId WHERE DST.DetailStatusCode = 'Approved' AND DST.ExpirationTimestamp IS NULL and HDR.PayGroup = 'Group A'; --Query to get createtime SELECT max(CDS.effectiveTimestamp)
  • 游标1更改后,两次调用了Content Observer onChange方法两次(Content Observer onChange method called twice after 1 change in cursor)
    问题 我有一个应用程序,希望将android联系人列表中的详细信息发送到远程服务器,以便用户可以在线查看其联系人。 为此,我想将电话上对联系人列表所做的任何更改通知远程服务器。 我已经从启动手机时启动的服务的“ ContactsContract.Contacts.CONTENT_URI”上设置了ContentObserver。 我有很多疑问,前两个是偶然的,第三个是我的主要关注点。 1:一旦我设置了一个在Cursor上注册ContentObserver的服务,该观察者是否仅存在于该服务中? 我的意思是,如果服务被终止,contentObserver是否继续观察? 2:我怀疑答案是否定的,但是我还是会问。 无论如何,是否知道要更新哪个联系人正在触发我的contentObserver的onchange方法? 当前,我必须编译电话上所有联系人的列表,然后将其发送到我的远程服务器,仅发送要更新的联系人的详细信息将变得非常容易。 3:这是我的主要问题,当我更改“联系人列表”时,onChange方法被快速连续触发两次。 1个零钱,2个电话。 无论如何有管理吗? public class ContactService extends Service { JSONArray contactList; @Override public IBinder onBind(Intent arg0) {
  • 游标中的 PL/SQL 变量是否与绑定参数有效相同?(Are PL/SQL variables in cursors effectively the same as bind parameters?)
    问题 我听说使用绑定变量效率更高(可能),因为对于具有不同绑定值的后续调用,查询本身仍然是相同的,因此不再需要对其进行解析。 我理解为什么固定值会出现这种情况。 在下面的游标中,该值固定为1。如果我有一个相同的游标,除了1变为2,这是一个差异查询。 清到此为止。 declare cursor C_CURSOR is select * from TESTTABLE pt where pt.ID = 1; 但我想知道在游标内使用 PL/SQL 变量时是否也是这种情况。 它们是否被扩展为一个固定值,或者它们是否被解释为绑定变量。 我已经进行了广泛的搜索,但到处都可以找到有关文字的示例,如上述情况,但没有明确解释 PL/SQL 变量的使用。 换句话说,在下面的两个片段中,第二个可能更有效,还是它们本质上相同? 直接在游标中使用 PL/SQL 变量: declare V_TEST integer := 1; cursor C_CURSOR is select * from TESTTABLE pt where pt.ID = V_TEST; begin for r in C_CURSOR loop null; end loop; end; 使用绑定变量: declare V_TEST int := 1; cursor C_CURSOR(B_TEST int) is select * from