在 PL/SQL 中打印记录字段

2023-11-22

如何在 PL/SQL 中打印记录变量的所有字段。 记录变量有很多字段,那么有没有比打印每个字段更好的方法呢? 也尝试过动态sql但没有帮助。


基于 Ollies 使用 dbms_output 构建,但用于动态遍历光标

设置用于测试

/*create table temp (aa varchar2(50) , bb number , cc date ) ;

insert into temp (aa,bb,cc)
  select chr(level+100) , level, sysdate+level
    from dual
     connect by level < 15 ;
/
*/

显示测试的块(假设 11g)

set serveroutput on
declare
   l_cur SYS_REFCURSOR ;

    PROCEDURE CursorOutput(
                            p_refcursor        IN OUT SYS_REFCURSOR
                         )  
    AS
        l_desc          DBMS_SQL.DESC_TAB ;
        l_cols          BINARY_INTEGER ;
        l_cursor        BINARY_INTEGER ;
        v_varchar2      VARCHAR2( 4000 ) ;
        v_number        NUMBER ;
        v_date          DATE ;
        l_data          varchar2( 32767 ) ;
        l_columnValue   VARCHAR2( 32767 ) ;
        l_processedRows Number := 0;
    BEGIN

        /* Convert refcursor "parameter" to DBMS_SQL cursor... */
        l_cursor := DBMS_SQL.TO_CURSOR_NUMBER( p_refcursor );
        /* Describe the cursor... */
        DBMS_SQL.DESCRIBE_COLUMNS( l_cursor, l_cols, l_desc );

        /* Define columns to be fetched. We're only using V2, NUM, DATE for example...
        for a complete list of the col_types this link is accessible.
        http://download.oracle.com/docs/cd/B10501_01/server.920/a96540/sql_elements2a.htm#45504
        http://forums.oracle.com/forums/thread.jspa?threadID=912475
        if not a usable type, will throw new exception
        */
         FOR i IN 1 .. l_cols LOOP
             IF l_desc(i).col_type = 2 THEN
               DBMS_SQL.DEFINE_COLUMN(l_cursor, i, v_number);
            ELSIF l_desc(i).col_type = 12 THEN
               DBMS_SQL.DEFINE_COLUMN(l_cursor, i, v_date);
            ELSif l_desc(i).col_type = 01 or l_desc(i).col_type = 96 then
               DBMS_SQL.DEFINE_COLUMN(l_cursor, i, v_varchar2, 4000);
            else
                --raise an exception if the user's query contains a datatype not (yet) supported by this procedure
                RAISE_APPLICATION_ERROR(-20000, 'Invalid Data Type for conversion to delimited file. {' || l_desc(i).col_name || '}');
            END IF;
          END LOOP;


        /* -- print out the column names if desired
             FOR i IN 1 .. l_cols LOOP
                     dbms_output.put_line('** ' || l_desc(i).col_name) ;
             END LOOP;
        */

         /* Fetch all data... */
         WHILE DBMS_SQL.FETCH_ROWS(l_cursor) > 0 LOOP
             dbms_output.put_line('LINE: '  || l_processedRows || '');
             FOR i IN 1 .. l_cols LOOP
                 if l_desc(i).col_type = 12 THEN --we are in a date
                    DBMS_SQL.COLUMN_VALUE(l_cursor, i, v_date);
                    v_varchar2 := to_char(v_date , 'dd-MON-yyyy' ) ;
                 elsif  l_desc(i).col_type = 2 THEN --we are in a number
                    DBMS_SQL.COLUMN_VALUE(l_cursor, i, v_number);
                    v_varchar2 := to_char(v_number) ;
                 else --treat it as a string (should be varchar2,char,etc)
                    DBMS_SQL.COLUMN_VALUE(l_cursor, i, v_varchar2);
                    IF v_varchar2 IS NOT NULL THEN
                       v_varchar2 := '"' || v_varchar2 || '"' ;
                       ELSE
                       v_varchar2 := '';
                    END IF ;
                 end if ;
                 dbms_output.put_line(l_desc(i).col_name || '=>' || v_varchar2) ;
             END LOOP;
             l_processedRows := l_processedRows + 1 ;
          END LOOP;

          dbms_sql.close_cursor(l_cursor);
          dbms_output.put_line('I found and processed  '  || l_processedRows || ' rows .');

    END;

begin
        open l_cur for select * from temp;

        CursorOutput(p_refcursor => l_cur) ;

end ;
/

会给你这个结果

LINE: 0
AA=>"e"
BB=>1
CC=>04-JAN-2012
LINE: 1
AA=>"f"
BB=>2
CC=>05-JAN-2012
LINE: 2
AA=>"g"
BB=>3
CC=>06-JAN-2012
LINE: 3
AA=>"h"
BB=>4
CC=>07-JAN-2012
LINE: 4
AA=>"i"
BB=>5
CC=>08-JAN-2012
LINE: 5
AA=>"j"
BB=>6
CC=>09-JAN-2012
LINE: 6
AA=>"k"
BB=>7
CC=>10-JAN-2012
LINE: 7
AA=>"l"
BB=>8
CC=>11-JAN-2012
LINE: 8
AA=>"m"
BB=>9
CC=>12-JAN-2012
LINE: 9
AA=>"n"
BB=>10
CC=>13-JAN-2012
LINE: 10
AA=>"o"
BB=>11
CC=>14-JAN-2012
LINE: 11
AA=>"p"
BB=>12
CC=>15-JAN-2012
LINE: 12
AA=>"q"
BB=>13
CC=>16-JAN-2012
LINE: 13
AA=>"r"
BB=>14
CC=>17-JAN-2012
I found and processed  14 rows .

我做了类似的事情来动态构建一个 csv 文件,利用这两个链接作为源http://www.oracle-developer.net/display.php?id=505 http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:88212348059

然而,根据您的目的,您可能只想在 SQL Developer(或 Toad)中运行它并导出结果!

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

在 PL/SQL 中打印记录字段 的相关文章

  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 如何使用 SQLPLUS 假脱机到 CSV 格式的文件?

    我想将一些查询提取为 CSV 输出格式 不幸的是 我无法使用任何奇特的 SQL 客户端或任何语言来做到这一点 我必须使用SQLPLUS 我该怎么做 您还可以使用以下内容 尽管它确实在字段之间引入了空格 set colsep separate
  • 是什么原因导致 Oracle tkprof 文件中 CPU 时间和运行时间之间存在差异

    在分析 Oracle tkprof 跟踪文件时 我注意到有时 cpu 时间和经过的时间之间存在很大差异 但我不知道是什么原因造成的 例如 call count cpu elapsed disk query current rows Pars
  • Oracle 触发器创建时出现编译错误,ORA-02289: 序列不存在

    当我使用 PowerDesigner 生成 SQL 并在 Oracle 中运行它时 它会抛出错误 警告 触发器创建时出现编译错误 create trigger tib material classify before insert on m
  • 插入期间违反唯一约束:为什么? (甲骨文)

    我正在尝试在表中创建一个新行 表上有两个约束 一个是关键字段 DB ID 另一个是将值限制为字段 ENV 中的几个之一 当我进行插入时 我没有将关键字段作为我尝试插入的字段之一 但我收到此错误 unique constraint N390
  • 如何找到 Oracle 视图的基础列和表名称?

    这听起来应该很简单 但事实并非如此 我找不到任何 Oracle 元数据 视图可以提供 Oracle 视图列的基础列和表名称 我发现这样做的唯一方法是解析视图源 SQL 这与精确的科学相去甚远 为了解释我想要什么 请考虑我在 SCOTT 模式
  • SQL SELECT 对值求和,不包括重复项

    我在 Oracle SQL 中遇到一个问题 我正在尝试解决这个问题 我将用一个例子来说明 我正在查询三个表 Employees EmployeeID Name 1 John Smith 2 Douglas Hoppalot 3 Harry
  • 从 all_tab_columns 中选择,其中表有 > 0 行

    我需要在大型数据库中搜索与列名匹配的表 但该表必须有超过 0 行 顺便说一句 这是查询 SELECT FROM all tab columns WHERE column name LIKE ID SUPPORT 您可以使用单个查询来过滤名称
  • Oracle SQL 触发器上的变异表

    我正在尝试执行触发器 但出现变异表错误 SQL 代码是这样的 CREATE OR REPLACE TRIGGER CHK Apartado D BEFORE INSERT OR UPDATE ON CONTRACTS FOR EACH RO
  • PL/SQL 过程成功完成但没有显示任何内容

    我有以下过程代码 create or replace PROCEDURE Ventas cliente p DNI IN CHAR IS CURSOR c pedidos clientes IS SELECT FROM Pedidos ve
  • 休眠可能会导致此“获取顺序错误”错误吗?

    我尝试使用 Hibernate Spring JPA 执行此查询 在 Oracle DB 中 Query value DELETE from MY TABLE where ID ID nativeQuery true void delete
  • Oracle 中的函数与过程

    Oracle 中函数和过程的主要区别是什么 如果我可以用函数完成所有事情 为什么我必须使用过程 如果我无法在sql语句中调用过程 好吧 我会编写一个函数来完成相同的工作 过程不返回值 好的 在任何 dml 操作后我将仅返回 sql rowc
  • Oracle中如何检测4字节UTF8字符

    我们已经看到oracle中存储了4字节的UTF 8字符 我们需要检测特定列中有多少行包含此类字符 尝试了这里给出的建议 UTF 16 补充字符 https stackoverflow com questions 34720830 how t
  • 递归 SQL 给出 ORA-01790

    使用 Oracle 11g 第 2 版 以下查询给出 ORA 01790 表达式必须与相应表达式具有相同的数据类型 with intervals time interval AS select trunc systimestamp from
  • 授予用户在查询时使用表索引的什么?

    我想知道当用户从表中查询数据并且该用户已被授予以下权限时 oracle 是否使用索引 grant select on table to user 我想知道是否需要其他拨款才能使用索引 不 没有要求 或能力 授予对索引的访问权限 如果用户可以
  • Oracle 9i:同义词表不存在?

    我创建了一个包 其中包含一个存储过程 我计划从单独的应用程序调用该存储过程 存储过程将返回架构中所有视图和表的排序列表 为此 它对 DBA TABLES 和 DBA VIEWS 同义词执行简单的选择 如下所示 CREATE OR REPLA
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • Oracle TDE 能否保护数据免受 DBA 的侵害?

    甲骨文专家 我的客户想要部署一个必须在数据库中保存信用卡号的应用程序 客户显然很关心安全性 我们特别关注一个令人痛苦的问题 我们如何确保只有具有 业务需要知道 的授权用户才可以访问数据 我们如何保护数据免受 DBA 的侵害 一个明显的解决方
  • ORA-12154: TNS: 无法解析指定的连接标识符 (PLSQL Developer)

    我需要使用 PLSQL Developer 访问 oracle 数据库 当我尝试连接到数据库时出现以下错误 ORA 12154 TNS could not resolve the connect identifier specified 我

随机推荐

  • 一旦完成,这个可运行的线程最后会发生什么?

    我有这个线程从服务器下载一些图像 因此 一旦它下载了图像 我就会调用处理程序并进行 UI 更新 因此 由于线程的 stop 已被弃用 我无法使用它 我在这里有两个问题 这个线程最终会发生什么 意味着在我调用处理程序方法之后它会发生什么 或者
  • 将系列作为新行添加到 DataFrame 中会触发 FutureWarning

    尝试添加新行类型Series into a DataFrame 两者共享相同的列 索引 df loc df shape 0 r Getting FutureWarning 在未来版本中 object dtype 列将带有 all bool
  • 有没有办法使用 SQL Server JDBC 驱动程序显示 PRINT 结果?

    如果我的存储过程中有一个 print 语句 print message 有没有办法获取通过 JDBC 连接到 SQL Server 2008 的 java 程序的输出 另外 是否有危险print当从 JDBC 应用程序调用时 留下用于调试的
  • 确定 Rails 中某个方法所属的类

    Ap Application routes draw do resources accounts end 我想知道 resources 方法所属的类或模块 如果我在中搜索 资源 方法http apidock com rails 在提供的搜索
  • map.setCenter() 函数无法正常工作

    这是代码
  • 处理作曲家废弃包的最佳实践是什么?

    当我运行作曲家更新时 我偶尔会收到软件包已被放弃的消息 我应该使用不同的软件包 例如Package webflo drupal core require dev is abandoned you should avoid using it
  • 上传文件在更新面板中不起作用

    我不想刷新或回发我的页面 所以我尝试在 updatepanel 中上传文件 但单击上传按钮时验证检查显示没有文件 我的html代码是
  • C++14 变量模板:它们的用途是什么?有使用示例吗?

    C 14 将允许创建模板化变量 通常的例子是变量 pi 可以读取它来获取各种类型的数学常数 的值 3 表示int 最接近的值可能是float etc 除此之外 我们只需将变量包装在模板化结构或类中即可获得此功能 这如何与类型转换混合 我看到
  • 如何从 woocommerce 获取商品的库存数量?

    我在正确显示库存数量时遇到了一些问题 这是循环 span class price PREIS span class amount span span
  • 如何追踪内存峰值? (这是带有 p 的峰值,而不是带有 l 的峰值。)

    我有一个信息亭应用程序 它本质上显示了一堆幻灯片 其中包含各种信息 我最初是在一年前开始编写这个代码的 当时我刚开始从事 Objective C 和 iOS 开发 我发现我的代码风格现在比以前干净多了 而且我的经验也丰富了 所以我决定从头开
  • Angular2 传递函数作为组件输入不起作用

    我有一个以函数作为输入的组件 我已经从父级传递了这个函数 尽管调用了该函数 但该函数无法访问声明该函数的实例的依赖项 这是组件 Component selector custom element template val export cl
  • WCF ChannelFactory 与生成代理

    只是想知道当您可以使用 ChannelFactory 调用时 在什么情况下您更愿意从 WCF 服务生成代理 这样你就不必生成代理并担心服务器更新时重新生成代理了 Thanks 创建 WCF 客户端有 3 种基本方法 让 Visual Stu
  • 限制ManyToManyField的最大选择

    我试图限制模型记录在 ManyToManyField 中可以拥有的最大选择数量 在此示例中 有一个可以与区域相关的博客站点 在此示例中 我想将博客站点限制为只能有 3 个区域 这似乎是以前被问过 回答过的问题 但经过几个小时的探索后 我还没
  • Helm 图表之间的依赖关系是否应该反映微服务之间的依赖关系?

    给定以下服务方案及其依赖项 我想设计一组 Helm 图表 API Gateway calls Service A and Service C Service A calls Service B Service B calls Databas
  • ASP.NET Identity 2.0:如何重新哈希密码

    我正在 ASP NET 5 0 Web 应用程序中将用户从旧用户存储迁移到 ASP NET Identity 2 0 我有一种验证旧哈希值的方法 但我想在登录时将它们升级到 ASP NET Identity 2 0 哈希值 我创建了一个自定
  • 使用 MemoryStream 写入 XML

    我注意到有两种不同的方法将数据写入 XML 文件 为简洁起见 省略了错误处理 第一种方法是构建 XML 文档 然后将 XML 保存到文件中 using XmlWriter writer XmlWriter Create fileName w
  • 如何在makefile配方中设置环境变量?

    这是一个简化的 Makefile all for i 0 i lt 5 i do var var i echo var done echo var 我认为 var 的值是 0 1 2 3 4 但输出是 0 0 1 0 1 2 0 1 2 3
  • 如何实现CoreData记录的重新排序?

    我在 iPhone 应用程序中使用 CoreData 但 CoreData 不提供允许您对记录重新排序的自动方法 我想过使用另一列来存储订单信息 但是使用连续数字作为排序索引有问题 如果我正在处理大量数据 重新排序记录可能涉及更新排序信息上
  • Play 框架如何运作?

    我喜欢玩 与其他企业 Java 框架相比 它对于开发人员来说使用起来非常简单 但是 它是如何做到的呢 是什么让像 Java 这样的编译语言能够实现编辑 刷新循环 是什么让 Play 按其工作方式工作 Play 使用 Eclipse 编译器在
  • 在 PL/SQL 中打印记录字段

    如何在 PL SQL 中打印记录变量的所有字段 记录变量有很多字段 那么有没有比打印每个字段更好的方法呢 也尝试过动态sql但没有帮助 基于 Ollies 使用 dbms output 构建 但用于动态遍历光标 设置用于测试 create