当前位置: 首页 > 面试题库 >

遍历循环以查找重复的名称

邬友樵
2023-03-14
问题内容

我从查询中得到以下结果,并在plsql块中浏览记录并向客户发送send_email。

匿名块

FOR i IN (SELECT product_no, product_holder,product_catalogue FROM
product_master)
LOOP
mail_send('PRODMASTER',i.product_holder, i.product_no,i.product_catalogue);
END LOOP;

我想知道最好的方法product_holder是重复查询结果,而不是发送多封电子邮件,而是发送一封包含相关详细信息的电子邮件。例如,在上述情况下SMITH重复两次,所以用上面的方法将史密斯拿到两封电子邮件,而不是我想发一封电子邮件SMITHproduct_noproduct_catalogue

我怎样才能做到这一点?


问题答案:

为此,请不要在PL / SQL的循环内进行循环-使用SQL为您准备好要使用的数据。

首先,我们使用一些测试数据创建表(我正在猜测数据类型-您将使用自己的数据类型进行替换):

create table product_master (
   product_no        varchar2(10)
 , product_holder    varchar2(10)
 , product_catalogue varchar2(10)
)
/

insert into product_master values ('1', 'SMITH', 'TEMP')
/
insert into product_master values ('2', 'SMITH', 'TEMP')
/
insert into product_master values ('3', 'HARRY', 'ARCH')
/
insert into product_master values ('4', 'TOM'  , 'DEPL')
/
commit
/

我们想要发送给mail_send过程的product_holder是包含product_no和的集合(数组)product_catalogue。因此,首先是一个包含这两个元素的类型:

create type t_prod_cat_no as object (
   product_no        varchar2(10)
 , product_catalogue varchar2(10)
)
/

然后是该类型的嵌套表类型(集合类型):

create type t_prod_cat_no_table as
   table of t_prod_cat_no
/

mail_send然后,该过程应接受product_holder和的收集类型:

create or replace procedure mail_send (
   p_parameter        in varchar2
 , p_product_holder   in varchar2
 , p_product_cats_nos in t_prod_cat_no_table
)
is
begin
   dbms_output.put_line('-- BEGIN '||p_parameter||' --');
   dbms_output.put_line('Dear '||p_product_holder);
   dbms_output.put_line('Your products are:');
   for i in 1..p_product_cats_nos.count loop
      dbms_output.put_line(
         'Catalogue: '||p_product_cats_nos(i).product_catalogue||
         ' - No: '||p_product_cats_nos(i).product_no
      );
   end loop;
end mail_send;
/

(我只是使用dbms_output来模拟构建邮件。)

然后,您可以在SQL中执行group by product_holder并让SQL生成包含数据的集合:

begin
   for holder in (
      select pm.product_holder
           , cast(
                collect(
                   t_prod_cat_no(pm.product_no,pm.product_catalogue)
                   order by pm.product_catalogue
                          , pm.product_no
                ) as t_prod_cat_no_table
             ) product_cats_nos 
        from product_master pm
       group by pm.product_holder
       order by pm.product_holder
   ) loop
      mail_send(
         'PRODMASTER'
       , holder.product_holder
       , holder.product_cats_nos
      );
   end loop;
end;
/

上面的块的输出将是:

-- BEGIN PRODMASTER --
Dear HARRY
Your products are:
Catalogue: ARCH - No: 3
-- BEGIN PRODMASTER --
Dear SMITH
Your products are:
Catalogue: TEMP - No: 1
Catalogue: TEMP - No: 2
-- BEGIN PRODMASTER --
Dear TOM
Your products are:
Catalogue: DEPL - No: 4

使用SQL在SQL中执行此操作,GROUP BY可以通过PL /
SQL到SQL的单个调用为您提供一切,这比第一个调用获取独特的product_holder,循环遍历,然后每个product_holder获取一个调用的效率要高得多。每个持有人的产品。

更新:

在上面的代码中添加order bycollect函数中,以显示您可以控制集合中数据的填充顺序。



 类似资料:
  • 我是python的新手,正在学习使用dataframes和列表理解。我有以下数据帧: 现在我想把每个子列表拆分成单词。对于一个列表列表,我可以使用 但是我如何在数据帧上迭代它呢?我想我必须构建一个列表理解,然后使用方法来超越?但我不知道怎么做。我将为单个列表构建列表理解,如下所示:

  • 问题内容: 我有一个具有1 2 3 4 5值的数组。 现在我想以循环方式遍历它。像我想打印2 3 4 5 1或3 4 5 1 2或5 1 2 3 4等等。有什么 算法 吗? 编辑: 我想以循环方式打印所有组合。我不想在初始阶段说明起点。 问题答案: (如果要从向下迭代数组,请在数组下标表达式中更改为。) 我应该注意,就执行速度而言,这可能不是表达循环的最有效方法。但是,差异很小,并且 很可能无关紧

  • 例如,我有5项: 当我们使用这样的映射方法时: 我们显示所有的项目; 但我只想展示其中的3个项目 我怎么能做到呢?(使用map方法或for方法或其他方法)

  • 我有一门课叫“男人”。人的一个变量是人的“身高”。 例如,我有10个具有不同高度参数值的“Man”对象,现在我想按高度对这些对象进行排序。我怎样才能做到这一点?

  • 我有一个包含许多子目录的目录,其中包括一个名为OLD的目录。这个旧文件夹也可能位于任何子目录中,并包含存档文件 根目录A 文件1。txt 文件2。txt 旧的 文件1。txt 文件1。txt 老 子目录E 文件7。txt 旧的 我需要在Talend中创建一个作业,该作业将查找所有OLD文件夹(在主目录和子目录中)并从该文件夹中删除文件。我可以使用tFilelist来屏蔽要删除的文件。但无法弄清楚如

  • 问题内容: 以下是提供输出的代码段:。由于访问列表中的数字3,我期望获得输出。在线给出的解释是“每次迭代中更改的价值”,但我不太了解如何或为什么。任何解释都很好! 问题答案: 这里发生的是一个列表在循环过程中发生了变异。 让我们考虑以下代码片段: 输出为: 每次迭代: 从内部指针当前指向的位置读取值 立即将其分配给列表中的最后一个元素 在最后一个元素打印在标准输出上之后 就像这样: 内部指针指向第