【问题标题】:Sorting Data at the runtime in Oracle PL/SQL using Associative array在 Oracle PL/SQL 中使用关联数组在运行时对数据进行排序
【发布时间】:2021-10-27 14:26:06
【问题描述】:

我正在尝试对运行时查询中的数据进行排序,如果不使用集合,我无法做到这一点。本质上,我在服务表中有 2 列 - SERVICE_ID、SERVICE_NAME。我在包中创建了一个关联数组,以便可以在我的过程中使用它。

TYPE g_vc_arr IS TABLE OF VARCHAR2(4000) INDEX BY PLS_INTEGER;

在我的 pl/sql 块中,我正在创建一个如下所示的变量:

service_list my_pkg.g_vc_arr;

我将 SERVICE_ID 和 SERVICE_NAME 分配给这个变量,如下所示:

LOOP
  service_list(services.SERVICE_ID) := services.SERVICE_NAME;
END LOOP;

现在,我正在使用它来对名称列进行排序,如下面的 sn-p。我可以打印姓名,但在此过程中,我丢失了 ID。

for query_result_row in (SELECT * from table(service_list) order by 1) loop
        dbms_output.put_line(query_result_row.COLUMN_VALUE);
end loop;

我需要 ID 和 NAME 来进一步处理。我怎样才能两者兼得?

【问题讨论】:

  • 刚刚通过 varchar2 定义了一个整数索引的集合并使用名称作为它的键,然后只使用迭代器(或我的旧迭代器:orasql.org/2017/10/02/…
  • 在这种情况下,您的收藏将按键排序
  • 没有任何sql
  • 发布您的来源以获得 service.service_name 为您的分配声明。如果select来自表或已构建游标,您可能不需要循环或排序。
  • 似乎问题与排序无关,尽管有标题。我认为这是关于在将 PL/SQL 关联数组视为关系表时如何将数组索引显示为列。还是真的只是排序?

标签: oracle sorting plsql associative-array


【解决方案1】:

正如其他人所提到的,您不需要对其进行排序,因为它已经按照您定义的顺序保存:

create or replace package demo
as
    type currency_tt is table of varchar2(3) index by pls_integer;

    currencies demo.currency_tt :=
        demo.currency_tt
        ( 1 => 'USD'
        , 2 => 'GBP'
        , 3 => 'EUR' );
end demo;
begin
    for r in (
        select * from table(demo.currencies)
    )
    loop
        dbms_output.put_line(r.column_value);
    end loop;
end;

输出:

USD
GBP
EUR

但您不需要 SQL,因为您可以按程序迭代关联数组:

declare
    i pls_integer := demo.currencies.first;
begin
    while i is not null loop
        dbms_output.put_line(i||' '||demo.currencies(i));
        i := demo.currencies.next(i);
    end loop;
end;

或者从 21c 开始,您可以像这样更方便地循环:

begin
    for id, ccy in pairs of demo.currencies loop
        dbms_output.put_line(id || ' '|| ccy);
    end loop;
end;
1 USD
2 GBP
3 EUR

【讨论】:

  • 谢谢!但是,数据未排序。在您的示例中,我需要为货币排序的数据。
【解决方案2】:

我稍微改变了我的方法来解决这个问题。我创建了一个包含 2 列 TYPE 作为记录和记录类型的关联数组的包:

create or replace package my_pkg is 
TYPE g_rec_type IS RECORD (ID  NUMBER, name VARCHAR2(4000));
TYPE g_rec_arr IS TABLE OF g_rec_type INDEX BY PLS_INTEGER;
end my_pkg;

在我实际的 PL/sql 块中,我创建了几个变量:

 i NUMBER := 0;
 service_list MY_PKG.g_rec_arr;

然后我创建了一个循环来将值分配给数组:

LOOP
    service_list(i).ID := services.SERVICE_ID;
    service_list(i).NAME := services.SUMMARY;
    i := i+1;
END LOOP; 

进一步排序我使用的值如下:

FOR query_result_row in (SELECT ID, NAME from table(service_list) order by NAME) LOOP
  dbms_output.put_line('ID is =>' || query_result_row.ID|| ' Name is =>' || query_result_row.NAME);
END LOOP;

它按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2011-01-28
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多