如何摆脱动态 SQL

2023-12-27

我的包体之一中有以下动态 SQL

 OPEN ccur for
    'select c.category 
     from test_category c 
     where c.deptid='||PI_N_Dept ||
     ' and c.category not in ('|| sExcludeCategories ||')';

sExcludeCategories将包含一组用逗号分隔的整数。我想消除这个动态SQL语句。有什么聪明的方法可以实现这一点吗?


我猜你知道你可以绑定一个变量PI_N_Dept删除那段动态sql。不幸的是你的IN条款和sExcludeCategories你不能在 Oracle 中为列表绑定变量(据我所知至少最多 9.2)

你确实有几个选择。您当前的解决方案是最简单的。另一个解决方案是更改过程以接受多个变量并创建 AND 语句列表。

'select c.category 
     from test_category c 
     where c.deptid= :PI_N_Dept
       and c.category <> :sExcludeCategory1 
       and c.category <> :sExcludeCategory2
       and c.category <> :sExcludeCategory3

';

或者有一个固定的 IN 值列表

'select c.category 
     from test_category c 
     where c.deptid= :PI_N_Dept
       and c.category not in (:sExcludeCategory1 , :sExcludeCategory2, :sExcludeCategory3)';

如果您只需要 2 个类别,则必须小心。第三个必须设置为 c.category 之外的某个值(注意:请小心并在此处测试空值)

另一种解决方案提出于Ask Tom http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:110612348061。这看起来很简单,虽然我还没有测试过。它的工作原理是创建一个函数 str2tbl() ,该函数允许您传递一系列以逗号分隔的数字,并通过 Dual 创建一个“表”来执行 IN 操作。

create or replace type myTableType as table of number;

create or replace function str2tbl( p_str in varchar2 ) return myTableType
  as
     l_str   long default p_str || ',';
     l_n        number;
     l_data    myTableType := myTabletype();
  begin
      loop
          l_n := instr( l_str, ',' );
          exit when (nvl(l_n,0) = 0);
          l_data.extend;
          l_data( l_data.count ) := ltrim(rtrim(substr(l_str,1,l_n-1)));
          l_str := substr( l_str, l_n+1 );
      end loop;
      return l_data;
  end;

你的例子看起来像

'select c.category 
     from test_category c 
     where c.deptid= :PI_N_Dept
       and c.category not in ( select * from INLIST ( select cast( str2tbl( :sExcludeCategories  ) as mytableType ) from dual ) )';

这只有在以下情况下才有效sExcludeCategories是一个数字列表。如果引号包含在变量中(并且您无法更改它),则必须更改 str2tbl 来处理引号,并更改myTableType to varchar2(10)或者更合适的东西。

总的来说,如果原始 SQL 不影响性能,那么为了简单起见,我会将其保留为动态 SQL。维护起来就不那么头疼了。否则测试 str2tbl。它应该在 Oracle 8 及更高版本中工作。

PS:为了完整起见,我遇到了这篇关于绑定变量的好文章 http://www.akadia.com/services/ora_bind_variables.html这涵盖了一些简单的问题,例如 IN 子句不使用变量。

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

如何摆脱动态 SQL 的相关文章

  • 每组最大 n 个 SQL 查询的高性能方法

    我正在尝试构建一个基础设施 以便根据需要快速运行回归 从包含我们网络服务器上所有历史活动的数据库中提取 apache 请求 为了通过确保我们仍然回归来自较小客户的请求来提高覆盖范围 我想通过为每个客户检索最多 n 个 为了这个问题 假设 1
  • 从存储过程执行SQL Server代理作业并返回作业结果

    需要有一个存储过程来调用 SQL Server 代理作业并返回作业是否成功运行 到目前为止我已经 CREATE PROCEDURE MonthlyData AS EXEC msdb dbo sp start job N MonthlyDat
  • 当您有两种类型的记录时,该表的最佳数据库设计是什么

    我正在跟踪练习 我有一个workout表与 id 练习ID 外键进入练习表 现在 一些练习 例如重量训练 将包含以下字段 重量 次数 我刚刚举起 10 次 100 磅 跑步等其他练习将包含以下字段 时间 距离 我刚刚跑了5英里 花了1个小时
  • 在 SQLite 数据库的特定位置插入一行

    我正在 SQLite Manager 中创建数据库 并且错误地忘记提及一行 现在 我想在中间手动添加一行 在其下方 其余的自动增量键应自动增加 1 我希望我的问题很清楚 Thanks 您不应该关心键值 只需在末尾附加行即可 如果您确实需要这
  • 无法使用symfony2连接数据库oracle

    我需要的 我需要将oracle数据库与symfony2连接 我已经通过 php m 检查过 oci8 pdo odbc odbc 这是我关注的链接https gist github com johnkary 6481664 https gi
  • MySQL Workbench:如何将 mysql 数据库导出到 .sql 文件?

    我需要将 mysql 工作台中的数据库导出到文件 sql 该怎么办 在 MySql Workbench 版本 8 0 中 您只需按照以下步骤操作即可 Go to Server tab Go to 数据库导出 这会打开类似这样的东西 在中选择
  • 从关键字后的文本中提取字符串

    我想从 SQL 字段中关键字后面的文本中提取内容 我有一个名为Description在表中 该字段的内容是 asdasf 关键字 狗 aeee 关键字 猫 ffffaa 关键词 狼 我想提取并保存 关键字 之后的文本 在本例中dog cat
  • PHP/MySQL - 在数据库中存储数组

    我正在开发一个 PHP 应用程序 它需要将各种设置存储在数据库中 客户经常询问是否可以添加或更改 删除某些内容 这导致了表格设计出现问题 基本上 我有很多布尔字段 它们只是指示是否为特定记录启用了各种设置 为了避免再弄乱表格 我正在考虑将数
  • 选择具有按两列分组的最大值的行

    我见过很多关于此类问题的解决方案 尤其是这个SQL 仅选择列上具有最大值的行 https stackoverflow com questions 7745609 sql select only rows with max value on
  • MySQL表按时间戳分区

    我已经对表进行了分区 由于内存不足错误 表太大 我已将其分区在时间戳列上 如下所示 CREATE TABLE test fname VARCHAR 50 NOT NULL lname VARCHAR 50 NOT NULL dob time
  • 带外键或不带外键的引用有什么区别

    关于SQLite 带外键或不带外键的引用有什么区别 这有什么区别 CREATE TABLE players set id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL player id INTEGE
  • 使用变量获取 SQL xml 属性值

    我有一个 SQL 函数 它接受一个名为attribute 这是我想要从中获取值的 xml 属性 xmlPath是完整的 XML 字符串 我的 xml 看起来像这样
  • 将具有重复值的数据插入 Postgresql

    我需要在 postgresql 中插入数据集 INSERT INTO table subject topics exams name of subject section topic subtopic VALUES Algebra Math
  • 具有自定义格式的 C# Generic DateTime.ToString() [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 使用时 DateTime ToString Contains 2016 实体框架产生 CAST DateValue AS nvarchar
  • 在 SQL Server 中执行嵌套 case 语句逻辑的最佳方法

    我正在编写一个 SQL 查询 其中返回的一些列需要根据很多条件进行计算 我目前正在使用嵌套的 case 语句 但它变得混乱 有更好的 更有组织性和 或可读性 方法吗 我使用的是 Microsoft SQL Server 2005 一个简化的
  • 计算Oracle中逗号分隔字符串中的元素数量

    假设我有一张桌子Col2是 varchar Col1 Col2 1 001 002 2 003 004 005 我需要计算 Col2 中的元素数量 并返回它 如果我这样做的话 select do something here with co
  • 使用SQL显示组内最小计数和最大计数

    Goal 我正在寻找一种方法来计算等于组的最小值或最大值的项目数 我的物品每隔几天就会收到一次 并且每两周输入一次 我需要查看每个 EntryDate 的最小和最大接收日期 以及最小和最大的项目计数 在 MS Access 中使用 SQL
  • Python、Oracle DB、列中的 XML 数据,获取 cx_Oracle.Object

    我正在使用 python 从 Oracle DB 获取数据 所有行都有一个包含 XML 数据的列 当我使用 python 打印从 Oracle DB 获取的数据时 包含 XML 数据的列将打印为 0x7fffe373b960 处的 cx O
  • 检索使用 Uniqueidentifier 插入的最后一行,它不是 IDENTITY

    我对一个查询感到困惑 我需要找出表中添加的最后一行 其中有一列数据类型为 Uniqueidentifier 列是 aspnet Applications ApplicationId 注意 该列是Uniqueidentifier 它不是IDE
  • SQL Server 2008中的分割函数

    I have Table1像这样的列 ID Name 1 MSSQL 2 MySQl 3 Oracle In Table2 我有一个像这样的专栏 Databasename 1 3 2 1 2 我的输出应该是 Databasename MSS

随机推荐

  • angularjs + spring mvc + json post请求

    我一直在网上对我的问题进行一些研究 我觉得我的代码反映了大多数示例中编写的内容 然而 它仍然不起作用 这就是我的问题 长话短说 我想发送 POST 请求以将新项目添加到某些 后端 对于 REST API 我使用 Spring MVC 为了发
  • 拒绝 then() 的承诺

    你怎么能拒绝来自其内部的承诺then 例如 Promise all promiseArr then gt if cond reject catch gt do something 我发现的唯一相关问题是 如何拒绝来自 then 函数内部的承
  • 将事件添加到本机日历不起作用

    我正在开发一个 Android 应用程序 我必须将事件添加到本机 Android 日历中 所以我尝试了以下代码 if Build VERSION SDK INT gt 8 l eventUri Uri parse content com a
  • AuthnProviderAlias ldap 可以与 Apache2.4.x 一起使用吗?

    这在 Apache2 2 中完美运行 但在 2 4 中则不然 我need现在使用2 4
  • 在 Discord.js 中将 Bot 作为前缀提及

    仅当我不向整个命令添加空格时 我的前缀才有效 例如 token prefix lt 453463055741747200 gt const Discord require discord js module exports run asyn
  • 按特定顺序对 JavaScript 对象数组进行排序(使用现有函数)

    给定一个对象数组 key a value 42 key d value 28 key c value 92 key b value 87 和一个键数组 c a b d 是否有 ECMAScript 函数或第 3 方 JavaScript 库
  • 从列表中删除不在另一个列表中的元素 - Kotlin

    我有两个 mutableList listOfA 有很多对象 包括重复项 而 listOfB 则较少 所以我想使用 listOfB 来过滤 listOfA 中的相似对象 这样所有列表的末尾都会有相同数量的具有相同键的对象 下面的代码可以解释
  • Linux 中程序信息的存储位置和方式

    我是 Linux 新手 我只是把它弄乱了 但现在我想让我的 Java 程序在 Linux 上运行 我在互联网上快速浏览了一下 找到了目录列表及其说明 usr lib似乎是我存储程序信息的最佳位置 但我刚刚在我的 VirtualBox VM
  • 如何使用 javascript 更改 YUI3 选项卡

    我想提供一个使用 YUI3 更改选项卡的附加链接 我有一个表单分布在多个选项卡上 因此在选项卡内容的底部我想要一个 继续 链接 该链接将用于下一个选项卡 有任何想法吗 myTabView selectChild index 是以编程方式更改
  • 在 pandas 数据帧上使用 str.contains [重复]

    这个问题在这里已经有答案了 这个 pandas python 代码生成错误消息 TypeError 一元 的操作数类型错误 float 我不知道为什么 因为我正在尝试操作 str 对象 df Anomalous Vendor Reasons
  • PHP SOAP 客户端可以理解多部分消息吗?

    有这样的神兽吗 简单的SOAP客户端 http www php net soapPHP 附带的不理解多部分消息 提前致谢 原生 PHPSoapClient http de3 php net manual en class soapclien
  • 面板双缓冲

    通过将 AllPaintingInWmPaint UserPaint 和 DoubleBuffer ControlStyles 的值设置为 true 可以对整个表单进行双缓冲 this SetStyle ControlStyles AllP
  • 如何使 Python 脚本独立可执行,无需任何依赖即可运行? [复制]

    这个问题在这里已经有答案了 我正在构建一个 Python 应用程序 不想强迫我的客户安装 Python 和模块 那么 有没有办法将Python脚本编译为独立的可执行文件呢 您可以使用py安装程序 http www pyinstaller o
  • 父docker中的CMD是否被子docker镜像中的CMD/ENTRYPOINT覆盖?

    我正在尝试深入了解 docker 我知道CMD or ENTRYPOINT用于指定docker镜像的启动 可运行命令CMD被覆盖ENTRYPOINT 但我不知道 当父 docker 镜像也有时 它是如何工作的CMD OR ENTRYPOIN
  • 将 DIV 放置在具有可变高度的固定 div 下方

    问题是这样的 可以说我有这样的东西 div div div div div div 我希望 below div 位于 top div 下方 但不使用 margin top 因为 top div 将具有不同的大小 此外 below div 的
  • Criteria查询规范中不同类型的合并规范

    我有一个Activity实体位于 ManyToOne有关系Event实体及其相应的元模型 Activity and Event 由 JPA 模型生成器生成 我创建了专门的课程ActivitySpecifications and EventS
  • 跨多个模块定义谓词的各个部分

    我正在尝试写一个谓词move 3它处理多种术语 每种术语都在单独的文件中定义 我正在尝试为此使用模块 因为这些文件包含其他应适当命名空间的谓词 所以 我创建了一个模块cat prolog内容 module cat move 3 multif
  • z3在处理非线性实数运算时能否始终给出结果

    我有一个问题需要解决一组非线性多项式约束 在处理非线性实数算术时 z3 能否始终给出结果 sat 或 unsat 结果也还好吗 是的 假设 1 资源可用 并且 2 您仅使用实际约束 以便nlsat使用了策略 正如我上次检查的那样 它没有与其
  • 如何更改警报对话框中按钮的颜色[重复]

    这个问题在这里已经有答案了 这是我创建对话框的代码 builder setMessage msg setNeutralButton Dismiss dialogClickListener setPositiveButton Edit dia
  • 如何摆脱动态 SQL

    我的包体之一中有以下动态 SQL OPEN ccur for select c category from test category c where c deptid PI N Dept and c category not in sEx