使用什么数据结构来在 PL/SQL 中对数据进行排序?

2024-01-03

这是Oracle 11.2g。在 PL/SQL 函数中,我有一个循环,每次迭代时我都会创建一个字符串和与该字符串关联的整数。该函数返回所有生成的字符串的最终串联,并按字母顺序或按整数值排序(取决于函数输入参数)。为了给出一个想法,我正在生成这样的东西:

Iteration String Integer
        1 Oslo        40
        2 Berlin      74
        3 Rome        25
        4 Paris       10

如果输入参数表示按字母顺序排序,则函数输出应如下所示:

Berlin, Oslo, Paris, Rome

否则,我们返回按关联整数的值排序的串联字符串:

Paris, Rome, Oslo, Berlin

实现这种排序最合适的数据结构是什么?我研究过集合、关联数组甚至变量数组。我对在 Oracle 中实现这一点似乎如此困难感到有点震惊。我看到了这个问题,但它在我的情况下不起作用,因为我需要能够按索引和值进行排序:如何在 PL/SQL 中对关联数组进行排序? https://stackoverflow.com/questions/7800880/how-to-sort-an-associative-array-in-pl-sql对于这种情况,是否有更合适的数据结构?您会如何排序?

Thanks!


如果您将 PL/SQL 用作 SQL 而不是像其他语言那样使用,则非常容易。它非常具体,有时正是因为如此才非常好。

有时我真的很讨厌PL/SQL,但这个案例绝对是关于爱的。

看看它是多么容易:

create type it as object (
  iter          number,
  stringval     varchar2(100),
  intval        integer
);

create type t_it as table of it;

declare
  t       t_it := new t_it();
  tmp1    varchar2(32767);
  tmp2    varchar2(32767);
begin
  t.extend(4);
  t(1) := new it(1,'Oslo',40);
  t(2) := new it(2,'Berlin',74);
  t(3) := new it(3,'Rome',25);
  t(4) := new it(4,'Paris',10);

  select listagg(stringval,', ') within group (order by stringval),
         listagg(stringval,', ') within group (order by intval)
  into tmp1, tmp2
  from table(t);

  dbms_output.put_line(tmp1);
  dbms_output.put_line(tmp2);
end;
/

drop type t_it;
drop type it;

在这里你可以看到必须创建全局类型的问题,而这正是我讨厌它的原因。但他们说在 Oracle 12 中可以使用本地定义的类型来完成,所以我在等待:)

输出是:

Berlin, Oslo, Paris, Rome
Paris, Rome, Oslo, Berlin

EDIT

由于您从一开始就不知道迭代量,唯一的方法是在每次迭代上进行扩展(这只是扩展的示例):

declare
  iterator       pls_integer := 1;
begin
  /* some type of loop*/ loop
    t.extend();

    -- one way to assign
    t(t.last) := new it(1,'Oslo',40);

    -- another way is to use some integer iterator
    t(iterator) := new it(1,'Oslo',40);

    iterator := iterator + 1;
  end loop;
end;

我更喜欢第二种方式,因为它更快(不计算.last每次迭代)。

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

使用什么数据结构来在 PL/SQL 中对数据进行排序? 的相关文章

  • PHP—array_merge_recursive() - 相同键没有数组

    php a php gt data1 tag gt div classes gt 1 2 3 php gt data2 tag gt section classes gt 2 3 4 5 6 php gt result array merg
  • 将数组转换为具有默认值的对象的更简洁方法? (洛达什可用)

    我有一个数组 比如说 a b c 我想将其转换为一个对象 该对象以数组值作为键和我可以设置的默认值 所以如果默认值是true 我希望我的输出是 a true b true c true 下面的代码是否有更简洁的版本来实现此目的 var my
  • 多维数组内的移动

    我有一个用表格显示的数组 如何使用用户输入进行移动 目前 0 被分配给每个数组 但我计划为该数组分配其他值 我的问题是 如何使用用户输入在数组内向上 向下 向右 向左移动和对角移动 Array 0 gt Array 0 gt 0 1 gt
  • MySQL 排序顺序 - 排序规则?

    我在对 MySQL 中的 char 字段进行排序时遇到困难 问题是重音字符与非重音字符混淆 例如 Abc bd Acc 我认为这可能与整理有关 所以我将表格的排序规则更改为utf8 ut8 bin 看完之后这个帖子 https stacko
  • 如何在 JavaScript 中对关联数组进行排序?

    我需要为我的一个项目通过 JS 对关联数组进行排序 我发现这个函数在 Firefox 中运行得很好 但不幸的是它在 IE8 OPERA CHROME 中不起作用 无法找到使其在其他浏览器中运行的方法 或者找到另一个适合该目的的函数 我真的很
  • 从函数内的 SELECT 返回一个变量

    我正在尝试创建一个返回 varchar 的函数 其中一个字段形成一个选择 即聚合字段 我收到下一个错误 ORA 01422 exact fetch returns more than requested number of rows 我的理
  • 为什么java中LinkedList没有initialCapacity?

    我想知道为什么LinkedList没有initialCapacity 我知道什么时候使用ArrayList什么时候LinkedList 定义集合最终大小的好习惯是 List
  • Android:如何在播放媒体(mp3)时在特定毫秒内显示文本

    我正在尝试做一个类似卡拉 OK 的应用程序 我想在某一毫秒到来时显示一个或多个单词 例如 1148 毫秒 gt 打印 尼古拉斯 1826 毫秒 gt 打印 是 2766 毫秒 gt 打印 旧 ms gt 显示 这是我的代码 包 com ex
  • 在 C 中将字符追加到字符数组

    我想将一个字符附加到代表字符串的字符数组中 我正在使用结构来表示字符串 struct String char c int length int maxLength String realloc弄乱了我的数组 当我打印字符串时 它会从内存中打
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 如何实现n个元素的查找和插入操作的动态二分查找

    这个想法是使用多个数组 每个长度为 2 k 根据 n 的二进制表示来存储 n 个元素 每个数组都是排序的 不同的数组没有以任何方式排序 在上述数据结构中 SEARCH是通过对每个数组进行一系列二分查找来进行的 INSERT 是通过一系列相同
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • 二分插入排序和复杂度

    我有一个关于在插入排序算法中使用二分搜索的简单问题 更准确地说 在通常的插入排序的每一步中 我们不是将元素与前一个 已排序 子数组中的所有元素进行线性比较 而是在该已排序子数组中使用二分搜索来查找该元素所属的位置 我知道这减少了算法进行的比
  • mysql 版本号排序

    我有这样的价值观 1 1 2 9 1 2 2 4 1 2 3 4 3 2 14 3 2 1 4 2 我需要使用 mysql 对这些值进行排序 该数据类型是 varbinary 300 所需的输出将类似于 1 1 2 1 2 3 4 2 2
  • 使用 cout 打印字符数组的全部内容

    我对 C 很陌生 只是 Java 的背景不太好 并且对如何打印 char 数组的全部内容感到困惑 我相信我需要使用循环 并将循环基于数组的长度 但我的编译尝试没有成功 这就是我现在所拥有的 在此先感谢您的帮助 include
  • 数组到集合:优化代码

    有更好的方法来实现这一目标吗 public static List

随机推荐

  • 您可以在代码中导入“devDependency”吗?

    Mobx DevTool 的自述文件 https github com mobxjs mobx react devtools指导您将其安装为开发依赖项 然后将其导入到您的代码中 这对我来说似乎是一个问题 因为 devDependencies
  • 如何从给定的字符串中获取日期部分?

    我有这样的字符串 Mon 14 May 2012 13 56 38 GMT 现在我只想约会 即14 May 2012 为此我需要做什么 正确的方法是将其解析为Date对象并按照您想要的方式格式化该日期对象 DateFormat inputD
  • 将对象从 Java 传递到 Oracle 过程

    要将数组传递给 oracle 过程 我们使用ArrayDiscriptor and ARRAY 对象 我必须使用什么对象来将对象传递给 存储过程 ArrayDescriptor 和 ARRAY 类 以及 StructDescriptor 和
  • 如何在脚本中的多个文件中使用多个类?

    我需要制作一个独立的 Groovy 脚本 该脚本不需要编译并且无需安装 Groovy 即可运行 它运行良好 但无法识别除主脚本之外的任何其他脚本 我的文件夹结构如下 libs groovy all 2 4 3 jar ivy 2 4 0 j
  • Pyspark:从涉及数组列的 Json 架构创建架构

    我在 json 文件中定义了 df 的架构 如下所示 table1 fields metadata name first name type string nullable false metadata name last name typ
  • svnblame引起的声纳分析时jenkins出错

    当我运行詹金斯任务时 出现以下错误 17 12 49 738 INFO Sensor SCM Sensor 17 12 49 847 INFO SCM provider for this project is svn 17 12 49 84
  • switch case 语句内的表达式

    我正在尝试创建一个 switch 语句 但我似乎无法使用被评估的表达式 而不是设置的字符串 整数 我可以使用 if 语句轻松做到这一点 但 case 应该会更快 我正在尝试以下操作 function reward amount var re
  • 在带有 MacPorts 的 Snow Leopard 上使用 postgresql84 和 postgis 时没有 liblwgeom

    我正在尝试在升级到 Snow Leopard 后恢复并运行我的开发环境 特别是 我需要 postgresql 和 postgis 工作 但我遇到了以下问题 安装完两者后 sudo port install postgresql84 post
  • Git 无法锁定引用“HEAD”:无法解析引用 HEAD

    我正在尝试将更改提交到我的存储库 但收到以下错误 git c diff mnemonicprefix false c core quotepath false commit q F C Users Contronym AppData Loc
  • django 和 mongodb 会让迁移成为过去吗?

    由于 mongo 没有模式 这是否意味着我们在更改模型时不必进行迁移 非关系数据库的迁移过程是什么样的 我认为这是一个非常好的问题 但根据您正在使用的库和您对 迁移 的期望 答案会有点分散 让我们看一下一些常见的迁移操作 添加一个字段 Mo
  • 通过pid查找task_struct的有效方法

    有没有一种有效的方法可以找到task struct对于指定的 PID 无需迭代task struct list 使用以下其中一项有什么问题吗 extern struct task struct find task by vpid pid t
  • 找不到要导入的项目

    我正在寻找 Android 中的 ePub 阅读器 我提到翻页机 http www pageturner reader org downloads 下载了它的 apk 并且它有效 但是当我下载它的源代码时github https githu
  • 如何使用 javascript 获取 MVC 应用程序的基本 URL

    如何使用 javascript 获取基本 URL 例如 当我从 Visual Studio 浏览我的网站时 如果我的 URL 是http localhost 20201 home index 我想得到http localhost 20201
  • 带 CriteriaQuery 的 where 子句中的子查询

    任何人都可以给我一些关于如何将这种子查询放入CriteriaQuery 我在用着JPA 2 0 休眠 4 x SELECT a b c FROM tableA WHERE a SELECT d FROM tableB WHERE table
  • 根据另一个数组的顺序对数组子键进行排序

    我知道有很多关于数组排序的帖子 但我到处寻找 找不到解决我的问题的方法 我在这里找到了一篇非常好的文章 http firsttube com read sorting a multi Dimension array with php htt
  • 如何以编程方式获取标签栏的高度?

    我发现 UITabBar 的高度是 49px 或 50px 取决于源 因为我不喜欢在代码中使用太多硬编码值 所以我想知道是否可以以编程方式检索选项卡栏的高度 亲切的问候 尼尔斯 R PS 我问的原因是因为我有一个视图控制器 带有包含文本字段
  • 对计算列进行非规范化时需要权衡哪些因素?

    我希望我没有在这里问一个太明显的问题 对于我当前的项目 我正在使用 sql server 2008 设计一个相对简单的数据库 对于其中一个表 我决定引入 计算列 未持久化 它的表达式只是其他两个数字列的乘积 其存在的唯一原因是方便 我正在对
  • C# 应用程序被检测为病毒

    对于相同的程序我几分钟前的问题 https stackoverflow com questions 20061 store data from a c application 我添加了一个安装项目并为该程序构建了一个 MSI 只是为了看看我
  • 如何在 Linq 和 Entity Framework 5 中使用 DbGeography.Filter?

    使用 Entity Framework 5 可以在 Linq 查询中使用 SQL Server Spatial 过程 例如 使用 DbGeography 对象 您可以使用 Buffer 方法 该方法将转换为 SQL Server 中的 ST
  • 使用什么数据结构来在 PL/SQL 中对数据进行排序?

    这是Oracle 11 2g 在 PL SQL 函数中 我有一个循环 每次迭代时我都会创建一个字符串和与该字符串关联的整数 该函数返回所有生成的字符串的最终串联 并按字母顺序或按整数值排序 取决于函数输入参数 为了给出一个想法 我正在生成这