返回顶部
首页 > 资讯 > 数据库 >DBMS_SQL 执行查询示例
  • 365
分享到

DBMS_SQL 执行查询示例

DBMS_SQL执行查询示例 2017-10-13 20:10:45 365人浏览 猪猪侠
摘要

通常情况下,需要动态执行查询语句尽量使用语法更简洁的 OPEN {SYS_REFCURSOR} FOR ... 或 EXECUTE IMMEDIATE ... 但当查询语句的列或绑定变量无法确定数量或类型时,还是需要使用更加灵活的 DBM

DBMS_SQL 执行查询示例

通常情况下,需要动态执行查询语句尽量使用语法更简洁的 OPEN {SYS_REFCURSOR} FOR ... 或 EXECUTE IMMEDIATE ...

当查询语句的列或绑定变量无法确定数量或类型时,还是需要使用更加灵活的 DBMS_SQL 包,下面是使用 DBMS_sql 包执行列数量可变的查询示例;一个典型的应用场景就是报表的生成,因为我们可能无法事先知道这个报表有多少列。

DECLARE
  -- 可变列数的报表查询编程示例
  l_Cursor_Id INTEGER;
  l_Col_Count INTEGER;
  l_Desc_Tbl2 Dbms_Sql.Desc_Tab2;
  l_Ret       INTEGER;
  l_Row_Count BINARY_INTEGER := 0;
  l_Row_Index BINARY_INTEGER := 1;
  c_Bulk_Size CONSTANT BINARY_INTEGER := 2; -- 每次提取的记录数
  -- 报表的每一列最终都是 VARCHAR2 类型
  TYPE Col_Val_Tbl_Type IS TABLE OF Dbms_Sql.Varchar2_Table INDEX BY PLS_INTEGER;
  l_Col_Val_Tbl Col_Val_Tbl_Type;
BEGIN
  -- 打开并解析查询语句
  l_Cursor_Id := Dbms_Sql.Open_Cursor;
  Dbms_Sql.Parse(l_Cursor_Id,
                 "SELECT ""X"" M, ""Y"" M FROM DUAL WHERE DUMMY = :T_DUMMY
UNION ALL SELECT ""C"", ""D"" FROM DUAL
UNioN ALL SELECT ""E"", ""F"" FROM DUAL",
                 Dbms_Sql.Native);
  -- 根据查询语句的列取出所有值
  Dbms_Sql.Describe_Columns2(l_Cursor_Id, l_Col_Count, l_Desc_Tbl2);
  FOR i IN 1 .. l_Col_Count LOOP
    l_Col_Val_Tbl(i)(0) := NULL;
    Dbms_Sql.Define_Array(c           => l_Cursor_Id,
                          Position    => i,
                          c_Tab       => l_Col_Val_Tbl(i),
                          Cnt         => c_Bulk_Size,
                          Lower_Bound => l_Row_Index);
  END LOOP;
  -- 绑定变量并执行
  Dbms_Sql.Bind_Variable(l_Cursor_Id, ":T_DUMMY", "X");
  l_Ret := Dbms_Sql.Execute(l_Cursor_Id); -- 返回 DML 语句的修改行数,此处不使用
  -- 遍历查询结果
  LOOP
    l_Row_Count := l_Row_Count + Dbms_Sql.Fetch_Rows(l_Cursor_Id);
    EXIT WHEN l_Row_Count < l_Row_Index; -- 取出记录后总行数未增加
    -- Dbms_Output.Put_Line("FETCH: " || (l_Row_Count - l_Row_Index + 1));
    -- 取每一列的值
    FOR j IN 1 .. l_Col_Count LOOP
      Dbms_Sql.Column_Value(l_Cursor_Id, j, l_Col_Val_Tbl(j));
    END LOOP;
    -- 遍历每一行
    FOR i IN l_Row_Index .. l_Row_Count LOOP
      FOR j IN 1 .. l_Col_Count LOOP
        -- 遍历每一列
        Dbms_Output.Put(l_Col_Val_Tbl(j) (i) || " ");
      END LOOP;
      Dbms_Output.Put_Line("");
    END LOOP;
    EXIT WHEN l_Row_Count - l_Row_Index + 1 < c_Bulk_Size; -- 本次取出的行数小于指定的值,不进行下次取值
    l_Row_Index := l_Row_Count + 1;
  END LOOP;
  -- 关闭
  IF Dbms_Sql.Is_Open(l_Cursor_Id) THEN
    Dbms_Sql.Close_Cursor(l_Cursor_Id);
  END IF;
END;

DBMS_SQL 包还提供了两个很棒的函数用于在 DBMS_SQL 的 CURSOR_NUMBER 和 SYS_REFCURSOR 之间切换,我们可以充分利用二者的长处:CURSOR_NUMBER 更灵活,SYS_REFCURSOR 更简洁。

例如上述示例在绑定变量上没有不确定性,只需要动态变化查询到的列,那么可以先使用语法简洁的 SYS_REFCURSOR 打开查询,然后切到 CURSOR_NUMBER 对列进行分析。

这两个函数的定义及说明如下:

function to_refcursor(cursor_number in out integer) return sys_refcursor;

CURSOR_NUMBER 必须是一个已经执行过(调用过 DBMS_SQL.EXECUTE)的查询,调用后游标的控制权转移到返回的 SYS_REFCURSOR 变量上,后续应且仅应 CLOSE SYS_REFCURSOR;

function to_cursor_number(rc in out sys_refcursor) return integer;

SYS_REFCURSOR 必须是一个已经打开(执行过 OPEN ... FOR ..)的查询,调用后游标的控制权转移到返回的 CURSOR_NUMBER 变量上,后续应且仅应 DBMS_SQL.CLOSE_CURSOR(CURSOR_NUMBER);

您可能感兴趣的文档:

--结束END--

本文标题: DBMS_SQL 执行查询示例

本文链接: https://lsjlt.com/news/6767.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • DBMS_SQL 执行查询示例
    通常情况下,需要动态执行查询语句尽量使用语法更简洁的 OPEN {SYS_REFCURSOR} FOR ... 或 EXECUTE IMMEDIATE ... 但当查询语句的列或绑定变量无法确定数量或类型时,还是需要使用更加灵活的 DBM...
    99+
    2017-10-13
    DBMS_SQL 执行查询示例
  • DBMS_SQL 执行 PL/SQL 代码块示例
    通常情况下,需要动态执行 PL/SQL 代码块尽量使用语法更简洁的 EXECUTE IMMEDIATE ... 但当绑定变量的数量甚至类型都可能变化时,还是需要使用更灵活的 DBMS_SQL 包,下面是使用 DBMS_SQL 执行 PL/...
    99+
    2015-03-14
    DBMS_SQL 执行 PL/SQL 代码块示例
  • c#中executereader执行查询示例分享
    以下是一个示例,展示如何使用C#中的ExecuteReader方法执行查询:```csharpusing System;using ...
    99+
    2023-08-08
    C#
  • SQL查询语句执行顺序的示例分析
    这篇文章主要介绍SQL查询语句执行顺序的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SQL查询语句执行顺序如下:(7) SELECT  (8)&...
    99+
    2024-04-02
  • SqlServer执行计划及Sql查询优化的示例分析
    SqlServer执行计划及Sql查询优化的示例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。谈到优化就必然要涉及索引,就像要讲锁必然要说...
    99+
    2024-04-02
  • Oracle查询执行计划
    执行计划(Execution Plan)也叫查询计划(Query Plan),它是数据库执行SQL语句的具体步骤和过程。SQL查询语句的执行计划主要包括: ● 访问表的方式。数据库通过索引或全表扫描等方式访问表中的数据。...
    99+
    2023-04-03
    Oracle查询执行计划 Oracle执行计划查询
  • Python中执行MySQL结果限制和分页查询示例详解
    目录python mysql 限制结果示例 1: 获取您自己的 Python 服务器示例 2: 从位置 3 开始,返回 5 条记录LEFT JOINRIGHT JOINPython MySQL 限制结果 限制结果数量 示...
    99+
    2023-11-14
    Python MySQL结果限制分页查询 Python MySQL
  • C# Linq延迟查询的执行实例代码
    C# Linq延迟查询 在定义linq查询表达式时,查询是不会执行,查询会在迭代数据项时运行。它使用yield return 语句返回谓词为true的元素。 var names ...
    99+
    2024-04-02
  • 查询Oracle执行的顺序
    explain plan for select CFG_ID, COUNT(0) total  from ...
    99+
    2024-04-02
  • MySQL执行时间的查询
    目录慢查询日志测试profile总结上一节我们介绍了mysql的索引,用于提高查询效率。那么我们应该优化哪些库的哪些sql呢? 答案1:肯定是查询频繁的数据库和查询执行时间长的sql。现在我们一一来解决这个问题。 首先如...
    99+
    2023-04-09
    MySQL执行时间查询 sql执行时间查询 MySQL时间查询
  • SQLServer中如何执行查询
    在SQLServer中执行查询,可以使用以下步骤: 打开SQLServer管理工具(如SQL Server Management...
    99+
    2024-04-02
  • IDEA连接Mysql数据库并执行查询操作的示例分析
    小编给大家分享一下IDEA连接Mysql数据库并执行查询操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 1、先写个 Mysql 的链接设置...
    99+
    2023-06-15
  • mysql 执行查询SQL 一直执行不出结果
    今天执行一个mysql 语句, 一直在 执行,执行了5分钟了,还是没有出来结果。 # 每个组织下包括 同级或者下级的 注册店铺数 # 查询 历史每一天的每个组织下的当天存在的门店数 select dt.`time...
    99+
    2021-12-24
    mysql 执行查询SQL 一直执行不出结果
  • MySQL查询语句的执行过程实例分析
    这篇文章主要讲解了“MySQL查询语句的执行过程实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL查询语句的执行过程实例分析”吧!1、MYSQ...
    99+
    2024-04-02
  • SQL查询语句执行原理
    首先有一个 user_info 表,表里有一个 id 字段,执行下面这条查询语句:select * from user_info where id = 1;返回结果为:mysql基本架构...
    99+
    2024-04-02
  • Oracle中如何执行SQL查询
    在Oracle中执行SQL查询有多种方式,其中最常见的方式是使用SQL Developer工具或者SQL*Plus命令行工具。以下是...
    99+
    2024-04-09
    Oracle
  • DB2中怎么执行SQL查询
    在DB2中执行SQL查询非常简单,只需要使用SELECT语句即可。以下是一个示例: SELECT * FROM table_...
    99+
    2024-04-09
    DB2
  • php中执行查询的函数
    php 中执行查询的函数是 mysqli_query(),该函数需要连接句柄和 sql 查询字符串作为参数,并返回一个表示查询结果的 mysqli_result 对象。 PHP 中执行...
    99+
    2024-04-29
    mysql
  • python执行数据库的查询操作实例讲解
    1、fetchone该方法获取下一个查询结果集。结果集是一个对象。 2、fetchall接收全部的返回结果行。 3、rowcount这是一个只读属性,并返回执行execute方法后影...
    99+
    2024-04-02
  • oralce执行查询操作一直是正在查询中
    背景 当天早上突然查询某张表无法查询 排查过程 查看是否锁表或正在提交的事务 select from v$locked_object;select from v$lock k, v$...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作