需要 Oracle PLSQL 函数的输出帮助

Posted

技术标签:

【中文标题】需要 Oracle PLSQL 函数的输出帮助【英文标题】:Need help in output for Oracle PLSQL function 【发布时间】:2020-11-08 03:42:36 【问题描述】:

目前正在开发oracle PLSQL函数,用于列出项目编号、职位和从事每个项目的员工姓名。

对于这个函数,我需要得到这样的输出: 【片段示例】

1001 Computation: Alvin, Peter
1002 Study methods: Bob, Robert
1003 Racing car: Robert

这是我目前的输出。 SQL> 执行项目组;

1001 Computation: Alvin
1001 Computation: Ami
1001 Computation: Michael
1001 Computation: Peter
1001 Computation: Wendy
1002 Study methods: Bob
1002 Study methods: Robert
1003 Racing car: Bob
1003 Racing car: Robert
1004 Football: Douglass
1004 Football: Eadger
1005 Swimming: Douglass
1005 Swimming: Eadger
1006 Training: Aban
1006 Training: Carl

[当前代码]

SQL> set echo on
SQL> set feedback on
SQL> set linesize 100
SQL> set pagesize 200
SQL> set serveroutput on
SQL> --
SQL> -- Task 01
SQL> --
SQL> CREATE OR REPLACE PROCEDURE PROJECTGROUPS
  2  IS
  3  Previous_pnum PROJECT.P#%type := -1;
  4  --
  5  begin
  6  for currentRow IN(select p.P#, p.PTITLE, e.NAME
  7  from PROJECT p LEFT OUTER JOIN EMPLOYEE e
  8  on p.d# = e.d#
  9  WHERE p.P# IN(1001,1002,1003,1004,1005,1006)
 10  ORDER BY p.P#, p.PTITLE, e.NAME)
 11  --
 12  --
 13  loop
 14  if currentRow.P# is not null then
 15  dbms_output.put_line(currentRow.P# || ' ' || currentRow.PTITLE || ': ' || currentRow.NAME);
 16  end if;
 17  Previous_pnum := currentRow.P#;
 18  end loop;
 19  dbms_output.put_line(NULL);
 20  END;
 21  /

Procedure created.

【问题讨论】:

您使用哪个 Oracle 数据库版本? 【参考方案1】:

你需要的是listagg函数。

这里是 SQL -

SELECT p.P#
      ,p.PTITLE
      ,listagg(e.NAME, ',') within group (order by e.name) employee_names
  FROM PROJECT p 
      ,EMPLOYEE e
 WHERE p.P# IN(1001,1002,1003,1004,1005,1006)
   AND p.d# = e.d#(+)
 GROUP
    BY p.P#
      ,p.PTITLE
 ORDER 
    BY p.P#
      ,p.PTITLE

【讨论】:

是否可以分享我如何将其添加到我的代码中。到目前为止我已经尝试过了,但得到了结果:9/2 PL/SQL: SQL 语句被忽略 11/60 PL/SQL: ORA-00923: FROM 关键字未在预期的地方找到 请使用显式连接语法,而不是太旧的逗号分隔表连接。 这是个人品味的问题。对我来说,传统的方式更加紧凑和优雅,更容易推理。【参考方案2】:

LISTAGG()函数返回字符串以便直接用别名(str)打印,打印如DBMS_OUTPUT.PUT_LINE( str )

SELECT p.p#||' '||p.ptitle||': '||LISTAGG( e.name, ',' ) WITHIN GROUP ( ORDER BY e.name ) AS str
  FROM project p
  LEFT JOIN employee e
    ON p.d# = e.d#
 WHERE p.p# BETWEEN 1001 AND 1006
 GROUP BY p.p#, p.ptitle
 ORDER BY p.p#, p.ptitle;

我们不知道您的样本数据集。也许您需要INNER JOIN,具体取决于数据。顺便说一句,似乎需要修复project 表的数据结构。我认为应该将d# 列移到另一个(第三个)表。

【讨论】:

以上是关于需要 Oracle PLSQL 函数的输出帮助的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle PLSQL 函数的输出过程中出现逗号问题

oracle /plsql 计算平闰年天数函数

plsql怎么导入oracle函数 .fnc文件的

PLSQL Developer 中decode()函数的基本用法?

如何在oracle plsql中提取和打印函数外的光标值

在一行上返回函数中的多个主键列。 PLSQL、SQL ORACLE 开发