需要 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 函数的输出帮助的主要内容,如果未能解决你的问题,请参考以下文章