如何将Oracle引用游标提取到表变量中?

2024-02-06

我正在尝试将数据从引用游标加载到表变量(或数组)中,如果表变量基于现有表%Rowtype,则引用游标可以工作,但我的引用游标得到 通过连接多个表来加载,所以让我尝试举一个例子来演示我正在尝试做什么,有人可以帮助我

--created table
create table SAM_TEMP(
    col1 number null,
    col2 varchar(100) null
);

--created procedure which outputs results from that table

CREATE OR REPLACE
PROCEDURE SP_OUT_RefCur_PARAM(
    C_RESULT OUT SYS_REFCURSOR
) IS
BEGIN
    OPEN C_RESULT FOR 
        SELECT COL1,COL2
        FROM SAM_TEMP;
END SP_OUT_RefCur_PARAM;

--seeing the output works like this
DECLARE 
    REFCUR SYS_REFCURSOR;   
    outtable SAM_TEMP%rowtype ;  
BEGIN 
    SP_OUT_RefCur_PARAM(REFCUR);
    LOOP
        FETCH REFCUR INTO outtable;
        EXIT WHEN REFCUR%NOTFOUND;
        dbms_output.put_line(outtable.col1);
    END LOOP;
    CLOSE REFCUR;
END;


--but when i try to run below script it is giving error,i think i am missing something
DECLARE 
    REFCUR SYS_REFCURSOR;   
    TYPE REFTABLETYPE IS RECORD (COL1 NUMBER, COL2  VARCHAR(100));
    TYPE TABLETYPE IS TABLE OF REFTABLETYPE;
    outtable TABLETYPE; 
BEGIN 
    SP_OUT_RefCur_PARAM(REFCUR);
    LOOP
        FETCH REFCUR INTO outtable;
        EXIT WHEN REFCUR%NOTFOUND;
        dbms_output.put_line(outtable.col1);
    END LOOP;
    CLOSE REFCUR;
END;

错误报告:

ORA-06550 line 9, column 21:
PLS-00597 expression 'OUTTABLE' in the INTO list is of wrong type
ORA-06550 line 9, column 3:
PL/SQL SQL Statement ignored
ORA-06550 line 11, column 32:
PLS-00302 component 'COL1' must be declared

不确定我缺少什么,提前感谢您的帮助


上面代码中的变量名称误导了您。你的变量outtable is in table类型。无法将记录数据提取到记录表中,但您可以将其提取到记录本身中。

DECLARE 
    REFCUR SYS_REFCURSOR;   
    TYPE RECORDTYPE IS RECORD (COL1 NUMBER, COL2  VARCHAR(100));
    outtable RECORDTYPE; 
BEGIN 
    SP_OUT_RefCur_PARAM(REFCUR);
    LOOP
        FETCH REFCUR INTO outtable;
        EXIT WHEN REFCUR%NOTFOUND;
        dbms_output.put_line(outtable.col1);
    END LOOP;
    CLOSE REFCUR;
END;

Update:如果您想获取所有数据以获得应用程序的更好性能,您需要使用 BULK COLLECT 语句:

DECLARE 
    REFCUR SYS_REFCURSOR;   
    TYPE RECORDTYPE IS
        RECORD (COL1 NUMBER, COL2  VARCHAR(100));
    TYPE TABLETYPE IS
        TABLE OF REFTABLETYPE
        INDEX BY PLS_INTEGER;
    outtable TABLETYPE; 
BEGIN 
    SP_OUT_RefCur_PARAM(REFCUR);
    LOOP
        FETCH REFCUR INTO BULK COLLECT outtable;
        EXIT WHEN outtable.COUNT = 0;

        FOR indx IN 1 .. outtable.COUNT 
        LOOP
            dbms_output.put_line(outtable(indx).col1);;
        END LOOP;
    END LOOP;
    CLOSE REFCUR;
END;

注意:使用 BULK 语句时的内存消耗比不使用时要多得多。

当您学习并开始学习时要记住的最重要的事情 利用 BULK COLLECT 等功能的优点是没有 免费午餐。几乎总是需要在某个地方做出权衡。 与许多其他方法一样,与 BULK COLLECT 的权衡 性能增强功能,是“运行速度更快但消耗更多 记忆。” (甲骨文杂志 http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html)

但是,如果您只是获取和处理行 - 一次一行,则不需要BULK语句,只需使用游标FOR LOOP. (Ask Tom http://asktom.oracle.com/pls/asktom/f?p=100:11:0%3a%3a%3a%3aP11_QUESTION_ID:1203923200346667188)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将Oracle引用游标提取到表变量中? 的相关文章

  • 匹配可能存在或可能不存在的组

    我的正则表达式需要解析一个如下所示的地址 BLOOKKOKATU 20 A 773 00810 HELSINKI SUOMI 1 2 3 4 第一组 第二组和第三组将始终存在于地址中 第 4 组可能不存在 我编写了一个正则表达式来帮助我获得
  • 转换不同世纪的日期

    我有暂存表 其中包含格式为 mm dd yy 的字符串形式的日期 我有 Oracle 11g 程序在加载到主表之前将字符串转换为日期格式 我在用着to date 03 20 34 mm dd rr 转换为日期格式 输出错误为 03 20 2
  • 如何在 Pro*C 查询中指定变量表达式列表?

    我尝试优化的 Pro C 查询出现问题 解释一下 我们的应用程序在一个巨大的数据库中搜索行 这些行存在于多种语言中 旧代码为数组中的每种语言选择一行 现在 由于这些查询是我们应用程序中最耗时的部分 因此我只想进行一个直接写入数组的查询 语言
  • 运行 Sqoop 导入和导出时如何找到最佳映射器数量?

    我正在使用 Sqoop 版本 1 4 2 和 Oracle 数据库 运行 Sqoop 命令时 例如这样 sqoop import fs
  • 从 CTE 插入

    WITH DTL AS SELECT CMPI CODE CMN CDTY MTRL CMI WT FACTOR CMI CNTRCT RATE PL PRESENT PRICE TRM CODE ROUND NVL PRESENT PRI
  • Oracle中如何选择前100行?

    我的要求是获取每个客户的最新订单 然后获取前100条记录 我编写了一个如下查询来获取每个客户的最新订单 内部查询工作正常 但我不知道如何根据结果获得前 100 名 SELECT FROM SELECT id client id ROW NU
  • PLS-00103:遇到符号“CREATE”

    这个包有什么问题 因为它给出了错误 CREATE OR REPLACE PACKAGE PKG SHOW CUST DETAILS AS PROCEDURE SHOW CUST DETAILS myArg VARCHAR2 END PKG
  • Postgresql存储过程中基于会话的全局变量?

    在 Oracle 的 PL SQL 中 我可以使用包定义创建基于会话的全局变量 对于 Postgresql 的 PLpg SQL 这似乎是不可能的 因为没有包 只有独立的过程和函数 以下是 PL SQL 将 g spool key 声明为全
  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小
  • 无法连接 ORA-12514: TNS: 侦听器当前不知道连接描述符中请求的服务

    我想将 PLSQL 开发工具连接到数据库 但由于以下错误而无法连接 ORA 12514 TNS 侦听器当前不知道连接描述符中请求的服务 检查下面的配置 如何配置才能使其正常工作 SQL gt select value from v para
  • 如何找到 Oracle 数据库的 URL?

    如何找到 Oracle 数据库的 URL 和端口 Example jdbc oracle thin host port dbName 用户名 密码 是否有我可以查看的 SQL 命令或日志 配置文件 对于甲骨文来说 有一个tnsnames o
  • 如何从 java.sql.Blob 类型的 zip 文件中读取和提取 zip 条目,而无需将 FileInputStream 或文件路径作为字符串 java

    public static void unzipFiles java sql Blob zip throws Exception String paths byte blobAsBytes zip getBytes 1 int zip le
  • Oracle 获取列值发生变化的行

    假设我有一张桌子 比如 ID CCTR DATE 1 2C 8 1 2018 2 2C 7 2 2018 3 2C 5 4 2017 4 2B 3 2 2017 5 2B 1 1 2017 6 UC 11 23 2016 还有其他字段 但我
  • 我可以从匿名 PL/SQL 块向 PHP 返回值吗?

    我正在使用 PHP 和 OCI8 执行匿名 Oracle PL SQL 代码块 有没有什么方法可以让我绑定一个变量并在块完成后获取其输出 就像我以类似的方式调用存储过程时一样 SQL declare something varchar2 I
  • 如何打印Oracle中过程的定义?

    oracle中有没有办法查看过程的结构是什么 我正在尝试记录并运行程序 并希望将实际的程序结构存储在我的日志中 您可以查询ALL SOURCE table SELECT text FROM all source WHERE owner lt
  • 创建 SYS_REFCURSOR 并将其作为输入参数从 Java 传递给 Oracle 过程

    我必须与具有 SYS REFCURSOR 作为输入参数的外部 Oracle 过程进行通信 过程 merge objects varchar2 中的 p table name p id array 中 varchar2 SYS REFCURS
  • Oracle:如果表存在

    我正在为 Oracle 数据库编写一些迁移脚本 并希望 Oracle 有类似于 MySQL 的东西IF EXISTS构造 具体来说 每当我想删除 MySQL 中的表时 我都会执行类似的操作 DROP TABLE IF EXISTS tabl
  • IO 错误:从读取调用中得到负一

    我的时间和想法都快用完了 我需要使用 Java 和 Oracle 数据库模拟预订整架飞机 我们有一些关于如何执行此操作以及预期内容的说明 但我们的代码始终出现这种非常奇怪和意外的行为 数据库看起来像这样 我们需要有一个不断运行的线程池来模拟
  • 不是 select 中带有 MAX 的单组组函数

    Select sg gameno Max sg Year sg end sg hostcity country olympic name from Summergames s Country co where s country isoco
  • 使用 gv$session 判断查询是否挂起

    我有一个在 Oracle 中运行的查询 该查询可能会挂起 也可能不会挂起 它现在已经运行了大约 10 个小时 但根据我正在加载的数据量 这可能并非不合理 我正在查看 gv session 中的会话 想知道是否有一种方法可以转换该信息以查看是

随机推荐

  • Python:使用 smtplib 模块发送电子邮件时未显示“主题”

    我能够使用 smtplib 模块成功发送电子邮件 但发送电子邮件时 发送的电子邮件中不包含主题 import smtplib SERVER
  • 每组最高

    在这里很难显示我的实际表和数据 因此我将用示例表和数据来描述我的问题 create table foo id int x part int y part int out id int out idx text insert into foo
  • 如何将 angular2 中的秒转换为时间字符串?

    因此 我一直在整个网络中寻找此功能 但没有找到可以用来将秒转换为可以表示为字符串的年 月 日 小时 分钟和秒的解决方案 我已经提出了 Angular2 中的 Pipe 解决方案 但是我想获得一些关于可以做得更好的事情的反馈来改进它 而且也许
  • 单个列表中的近似字符串匹配 - r

    我在一个长列表中包含数千个名字的数据框中列出了一个列表 许多名称都有细微的差别 这使得它们略有不同 我想找到一种方法来匹配这些名字 例如 names lt c jon smith jon smith Jon Smith jon smith
  • jsTree - 通过ajax按需加载子节点

    我正在尝试让 jsTree 能够按需加载子节点 我的代码是这样的 jQuery introspection tree jstree json data ajax url http localhost introspection intros
  • git推送认证失败

    我正在尝试从我的内部推送编辑任何地方的Python http www pythonanywhere comGitHub 上的原始主机的 hosting 帐户失败 它要求我提供 GitHub 用户名和密码 尽管提供了正确的凭据 它仍显示以下错
  • 如何将密码查询合并到 Py2neo v3 中的事务中

    在 py2neo v2 0 中 可以使用事务来执行 Cypher 语句 tx graph cypher begin tx append MERGE n Process proc nm proc nm ON CREATE SET n coun
  • 过滤 SQL 列中仅包含数字数据的行

    我在尝试着SELECT通过应用仅识别数字列的过滤条件 可以在表中显示行 这是一个仅报告的查询 因此我们最不关心性能 因为我们没有编译 PL SQL 的权限 无法检查TO NUMBER 并返回是否为数字 我必须用SQL来实现它 该列也具有这样
  • 在Python中模拟模拟对象的方法?

    我正在为一个用 Python 3 4 编写的项目编写单元测试 使用unittest mock图书馆 我正在测试的函数包含对函数的调用 versions get all versions some argument 我已经用一个修补程序Mag
  • iOS - 以编程方式获取当前正在播放的项目队列

    我想以编程方式获取当前在本机音乐应用程序中播放的队列 我可以用MP音乐播放器控制器获取当前正在播放的项目 但我不仅想获取该项目 还想获取整个播放队列 是否可以使用AV基金会或任何其他图书馆 我很确定这是不可能通过任何公共 API 实现的 s
  • 当output_dir包含空格时使用Rmarkdown生成PDF文档时出错

    这是一个最小的工作示例 名为mwe Rmd output pdf document latex engine xelatex keep tex TRUE header includes usepackage space grffile r
  • 使用 git Reset 转到较旧的变更集后,如何返回到历史记录中的最后一次提交?

    假设我的历史是这样的 A B C D 主 If I do git reset B 我会得到 A B 主 麻烦的是 git log现在只向我显示从A到B的历史 而我再也看不到C和D了 我怎样才能回到D 您应该能够看到 Dgit reflog
  • 如何将附加在 formData 中的 blob 发送到 php

    Issue 在上传大图像文件时 我发现在我的AWS server having 1gb memory使用它的全部容量 它会达到932 mb使用会导致进程崩溃 我以 DataURI 的形式保存该图像 然后我在某处读到以以下形式保存它blob可
  • Android 检查应用程序是否关闭

    我有一个android应用程序 我需要一个函数或任何广播接收器来检查应用程序是否关闭 我不需要在每个活动中调用销毁 应用程序中有大约20个活动 我尝试添加这个功能应用类 public class ApplicationLifeCycleMa
  • AsyncTask 中的 android.os.NetworkOnMainThreadException

    我意识到当您尝试在 UI 线程上执行某种网络请求时会发生此错误 但正如您在下面的代码中看到的 我实际上是在 AsyncTask 中调用 Http Get public class LeftPaneFragment extends Fragm
  • Eclipse 是否将第 3 方 GWT 库上传到 GAE?

    降低应用程序冷启动延迟的技巧之一是使用 上传尽可能少的 JAR 我想知道如何防止第 3 方 GWT 库 如 gwtquery jar 等 上传到 GAE 一旦应用程序被编译 这些就变得毫无用处 所以如果它们归因于延迟 那将是非常不幸的 如果
  • 表单设计器打破了通用抽象 UserControl

    我有一个通用摘要UserControl class SensorControl 我希望所有传感器控制面板都继承它 问题 当尝试设计时EthernetSensorControl 我从 Visual Studio 继承的 UserControl
  • 编译可在 iOS 6 和 iOS 7 中运行的应用程序

    我正在努力编译一个在 iOS 6 和 iOS 7 上使用的 iPad 应用程序 这是我不断收到的消息 Property barTintColor not found on object of type UITabBar did you me
  • WPF 网格布局面板,行高设置为“自动”

    我想要一个顶部和底部各有一行的网格 其中有标签或按钮 在中间我计划使用一个列表框 我希望列表框能够扩展以使用所有可用空间 最好不要对其他两行的高度进行硬编码 我的 XAML 如下 如何让中间部分自动展开 谢谢
  • 如何将Oracle引用游标提取到表变量中?

    我正在尝试将数据从引用游标加载到表变量 或数组 中 如果表变量基于现有表 Rowtype 则引用游标可以工作 但我的引用游标得到 通过连接多个表来加载 所以让我尝试举一个例子来演示我正在尝试做什么 有人可以帮助我 created table