我一直在使用rdbms'(mysql和postgresql),我注意到我真的不明白如何使用光标. 通常,一个通过客户端DB-API(例如Psycopg2或MySQLDB)将其脚本连接到DB: connection = psycopg2.connect(host='otherhost', etc) 然后创建一个光标: cursor = connection.cursor() 然后可以发出查询和命令: cursor.execute("SELECT * FROM etc") 现在,我想知道查询的结果在哪里?是在服务器上吗?还是我的客户端和服务器上的一点?然后,如果我们需要访问一些结果,我们将获取em: rows = cursor.fetchone() 或 rows = cursor.fetchmany() 现在说,我不检索所有行,而是决定执行另一个查询,以前的结果会怎样?是他们的开销. 另外,我是否应该为每种命令的每种形式创建一个
以下是关于 cursors 的编程技术问答
我已经存储了几次存储过程.我需要联合和返回数据,这是执行第二个过程后拥有的. 我可以以某种方式将几个光标的联合数据彼此转移到光标吗?没有临时表或类似表的数据类型? 编辑:联合的光标计数实际上是n(其中n是1、2、3等,通过另一个过程检测). 例如: CREATE OR REPLACE PROCEDURE proc_data ( data_out OUT SYS_REFCURSOR ) IS BEGIN OPEN data_out FOR SELECT '1' NUM FROM dual; END; / CREATE OR REPLACE PROCEDURE proc_result ( data_out OUT SYS_REFCURSOR ) IS data1 SYS_REFCURSOR; data2 SYS_REFCURSOR; BEGIN PROC_DATA(data1); PROC_DATA(data2); -- select data1 and
我一直在数据库光标上阅读,并且我看到的所有示例代码都明确打开并关闭了光标.我只用了几次,我从来没有这样做.谁能告诉我为什么有必要这样做?我知道如果您不关闭光标,您可以创建内存泄漏,但我从来不必打开一个. 谢谢 解决方案 如果您的光标是全局的(我想您使用了这不是问题的本地光标,因为它们在离开范围时已关闭),您必须明确关闭它们. 不关闭全局光标有几个问题 用于光标的内存未被划分 您可以打开最多数量的光标.最终,您将无法创建另一个,因为您将打开最大数量的光标数. 如果您问为什么我必须使用光标? - 有时您需要循环穿过行(例如使用常规循环).您无法在以设置为导向的方法中执行此操作 - 您必须使用光标. 其他解决方案 您只需要打开和关闭显式光标. DECLARE l_dept dept%rowtype; BEGIN -- implicit SELECT INTO SELECT * INTO l_dept FROM dept WHERE deptno = :
我想编写PL/SQL代码,该代码利用光标和批量收集来检索我的数据.我的数据库的行按数百万计的顺序排列,有时我必须查询它以根据客户的要求获取几乎所有记录.我分批进行查询和后续处理,以便不拥挤服务器并向客户端显示增量进度.我已经看到,挖掘以后的批次需要更多的时间,这就是为什么我试图通过光标做到这一点. 这是我的主SQL查询周围应该简单的PL/SQL: declare cursor device_row_cur is select /my_query_details/; type l_device_rows is table of device_row_cur%rowtype; out_entries l_device_rows := l_device_rows(); begin open device_row_cur; fetch device_row_cur bulk collect into out
我有一个以下Oracle存储过程 CREATE OR REPLACE PROCEDURE getRejectedReasons ( p_cursor IN OUT SYS_REFCURSOR) AS BEGIN OPEN p_cursor FOR SELECT * FROM reasons_for_rejection; END; 但是,当我在sql-developer中运行此存储过程时,我什么都看不到.我只看到这样的东西: Connecting to the database oracleLocal. Process exited. Disconnecting from the database oracleLocal. 我来自MS SQL Server,并且在运行这样的存储过程时习惯于查看实际结果.该存储过程是否不返回结果,因为我正在使用光标? 解决方案 存储过程正在返回某些东西,只是您对结果没有做任何事情. 您只需在SQLDE
我经常必须在Oracle PL/SQL中调试光标.我的问题是,我最终得到了几条大型光标,其中有50多个变量和常数.我正在寻找一种获取声明版本的方法,其中常数和变量被其文字所取代.如果我想找出为什么光标没有显示记录/线路,我应该最终替换这些变量/文字30分钟,然后才能运行Select并评论一些陈述以找出问题. 所以如果我有 之类的东西 CURSOR cFunnyCursor ( v1 NUMBER, v2 NUMBER ) IS SELECT * FROM TABLE WHERE col1 = v1 AND col2 != v2 AND col3 = CONSTANT; 我需要这样的选择: SELECT * FROM TABLE WHERE col1 = 123 AND col2 != 5324 AND col3 = 'ValueXyz'; 有什么方法可以以这种方式获取/记录选择,以便我可以将其复制在新的SQL窗口中,以便我不
我们有一个Spring Boot应用程序,我们需要在其中连接到Oracle DB并通过存储过程获取数据.我们的每个存储过程都有REF_CURSOR作为OUT参数.我正在使用@NamedStoredProcedureQuery和@Entity注释尝试相同的尝试.我们在pom.xml中使用ojdbc14.jar和application.properties in application.properties文件.在执行我的代码时,我会得到异常无效列名.同样在实体类中,我必须引入带注释@Id的字段,尽管我存储的过程的REF_CURSOR没有返回此类字段.这是一个问题吗?另外,不能定义@Id字段不是一个选项,因为Hibernate会引发异常.任何提示都将不胜感激. 实施和问题与问题非常相似 无效列列在打电话时通过JPA 2.1 与Ref_cursor一起存储的Oracle存储过程 ,但没有答案 解决方案 简单的示例如何实现: 数据库模式. create table
我试图在MySQL中使用光标多次调用存储过程.我想将其称为my_id的价值,存在于某个临时表中,并遍历这些ID并将结果串联. 无论如何,我在此过程的这一部分遇到了麻烦: DECLARE curs CURSOR FOR SELECT something FROM somewhere; 我不想从某个地方选择一些东西.我想要 之类的东西 DECLARE curs CURSOR FOR CALL storedproc(@an_id); DECLARE语句可以用于调用存储过程吗?还是必须仅与SELECT相关联?谷歌搜索,恐怕后者就是这种情况. 解决方案 使用光标需要一些标准的样板代码才能包围它. 使用光标从表中调用每组值的存储过程,基本上需要相同的样板.您SELECT您要通过的值,无论您从何处获取它们(可能是临时表,基础表或视图,并且可以包含对存储功能的调用),然后用这些值调用该过程. 我已经写了下面的样板代码的句法有效示例,并注释以解释每个
我正在开发一个SDG(单个显示组软件)应用程序,为此,我需要多个光标(对于最简单的不同颜色).我知道,使用C#您可以使用黑白光标,这无法解决我的问题. 解决方案 光标类的做法相当不错.由于某种神秘的原因,它使用了旧的com界面(ipicture),该接口不支持有色和动画光标.它可以用一些相当丑陋的肘油脂来解决: using System; using System.ComponentModel; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection; static class NativeMethods { public static Cursor LoadCustomCursor(string path) { IntPtr hCurs = LoadCursorFromFile(path); if (hCur
任何身体都知道如何使用JPA使用数据存储光标? 解决方案 您可以尝试一下(改编自 JDO样本): List results = (List) query.execute(); // Use the first 20 results... Cursor cursor = JPACursorHelper.getCursor(results); String cursorString = cursor.toWebSafeString(); // Store the cursorString... // ... // Query query = the same query that produced the cursor // String cursorString = the string from storage Cursor cursor = Cursor.fromWebSafeString(cursorString); que
我的公司希望为Android发布一个图书馆,以便其他人可以在自定义应用程序中轻松集成我们的内容. 现在我仍然非常不确定我应该如何提供内容.现在我正在使用pojos在我的项目中提供数据. 我遵循辩论"pojos与光标"对游标的青睐.我也见过一个例子其中某人将解析的资源存储在sqllite-db中,并通过光标稍后访问它. 我知道与pojos相比,光标有很多优点.但是,当您需要实施库时,您想混淆游标吗?你们中的一些人也可能已经写了这样的libs.你使用了什么?为什么? 其他libs如何执行它... facebook似乎使用pojos: 响应格式:服务器响应是JSON字符串. SDK提供util.parsejson()方法将其转换为jsonObject,其字段和值可以检查和访问. 解决方案 我们在上一个项目中使用了光标方法,发现它非常麻烦.特别是要检查光标中是否实际上是什么东西,迭代它,找到有价值的正确指标,正确关闭它..不是我想过一遍又一遍地做的.特
我正在创建一个 SQL 2008 R2 存储过程来复制一行及其所有子行. 这是一个包含父、子和子子的 3 层设置给定父母的 ID,我需要创建一个副本. 我已经使用 fast_forward cursor 解决了这个问题. 我知道我也可以用 while 循环遍历行来做到这一点,但我不相信这会比这种游标方法更快.你有什么想法? 有没有更好的方法在不使用光标的情况下完成这项任务? 编辑:我考虑的另一个选择是创建一个临时表来保存 TBLACStages 记录的旧/新 PKID. TBLACStages 可能有 1 到 20 个对应的行(并且 TBLACUpgrade 可能每个 TBLACStages 行有 3 行) CREATE PROCEDURE [dbo].[spDuplicateACUnit] @pACUnitID bigint = 0 AS BEGIN SET NOCOUNT ON; DECLARE @NewACUnitID bigint = 0
有关光标(特别是Oracle光标)的快速问题. 假设我有一张名为" my_table"的表,该表有两个列,一个ID和一个名称.有数百万的行,但名称列始终是字符串"测试". i然后运行此PL/SQL脚本: declare cursor cur is select t.id, t.name from my_table t order by 1; begin for cur_row in cur loop if (cur_row.name = 'test') then dbms_output.put_line('everything is fine!'); else dbms_output.put_line('error error error!!!!!'); exit; end if; end loop; end; / 如果我在运行时,请运行此SQL:
我有 2 个 SQL 提供不同的结果,如下所示, 表一: ----------------- PRRFNBR | PRNBR ---------------- 64929 | 083819 64973 | 083924 676761 | 879899 ----------------- 表 2: ---------------- PRRFNBR | PRNBR ---------------- 286054 | 083819 286056 | 083924 768789 | 876122 我需要比较两个表中的 PRRFNBR 数据并更新与表 1 匹配的表 2 结果,表 2 中的预期输出应该是这