创建在循环内输出不同名称的 Oracle PL/SQL 过程

Posted

技术标签:

【中文标题】创建在循环内输出不同名称的 Oracle PL/SQL 过程【英文标题】:Create Oracle PL/SQL procedure that outputs distinct names inside a loop 【发布时间】:2017-10-09 16:22:42 【问题描述】:

我刚开始使用 PL/SQL,所以,请善待。 我有一个简单的问题,我想从表中提取不同的名称。 当我这样做时,在循环内,我将对每个不同的名称执行一些其他操作。

我对如何在循环中获取唯一名称感到困惑。我所做的不起作用,因为如果我有:

1 MARY
2 MARY
3 JOHN

我正在输出:

MARY
MARY

代替:

MARY
JOHN

这是我的代码:

create or replace PROCEDURE CREATE_TABLE 
(
NM  OUT VARCHAR2,
tot OUT NUMBER
)
AS

BEGIN
SELECT count(DISTINCT NAME) INTO tot FROM MYTABLE;


FOR r IN 1..tot
LOOP
SELECT NAME INTO NM
FROM (
      SELECT DISTINCT NAME,
      ROWNUM rnum
      FROM MYTABLE
      ORDER BY NAME DESC
     ) 
WHERE rnum = r;

dbms_output.put_line (NM);
END LOOP;

END;

【问题讨论】:

SELECT DISTINCT NAME, ROWNUM rnum 是您的问题的根源 - 因为 rownum 对于所有记录都是唯一的,所以 DISTINCT 是多余的。您从子查询中获得了 2 个Mary,第一个是 rownum 1,第二个是 rownum 2。为什么在这里使用 rownum?我不明白你的意图。 对于每个唯一名称我需要做一些操作(加入其他表等)。我所需要的只是有一个循环,并在该循环内一次提取一个不同的名称。所以,在这种情况下,我想要 MARY,然后是 JOHN,这样我就可以加入另一个表,该表具有与 JOHN 或 MARY 相关的其他属性。 【参考方案1】:

我会改用隐式游标循环,它们很容易使用。

FOR r in (SELECT DISTINCT NAME
  FROM MYTABLE
  ORDER BY NAME DESC)
LOOP
  NM := r.NAME;
  dbms_output.put_line (NM);
END LOOP;

【讨论】:

这样好多了!谢谢!

以上是关于创建在循环内输出不同名称的 Oracle PL/SQL 过程的主要内容,如果未能解决你的问题,请参考以下文章

在具有不同变量名称的循环中保存

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,

oracle中怎么执行带有输出参数的存储过程,在程序中我知道怎么调用,

在循环中创建多个具有不同名称的对象以存储在数组列表中

如何在 VBA 循环中创建不同的变量名称

将 Matlab 中循环的输出保存在不同的文件夹中