#oracle #function #plsql
#Oracle #функция #plsql
Вопрос:
Я работаю над сохраненной функцией PL / SQL, которая находит имена иждивенцев сотрудника по номеру данного сотрудника. Пока я могу получить желаемый результат, но, похоже, у меня проблема с запятыми во время вывода. Приветствуется любая помощь в отношении того, как я могу удалить последнюю скобку во время вывода.
[Текущий код]
SQL> create or replace function FINDDEPENDENTS(empid in Employee.E#%TYPE)
2 RETURN VARCHAR IS
3 EID Employee.E#%TYPE;
4 Ename Employee.Name%TYPE;
5
6 DEPNAME Dependent.DName%TYPE;
7 finalRow VARCHAR(2000);
8 CURSOR q IS
9 --
10 select DName from Dependent WHERE E#=empid;
11 begin
12 select E#, Name INTO EID, Ename FROM Employee WHERE E#= empid;
13 finalRow:= EID || ' ' || Ename || ': ';
14 open q;
15 loop
16 fetch q into depname;
17 if q%notfound then exit;
18 end if;
19 finalRow:= finalRow || DEPNAME || ', ';
20 end loop;
21 close q;
22 return(finalRow);
23 end FINDDEPENDENTS;
24 /
Function created.
SQL> show errors
No errors.
SQL> SELECT FINDDEPENDENTS(E#) FROM Employee;
FINDDEPENDENTS(E#)
----------------------------------------------------------------------------------------------------
00100 Albert: Bolt, Edee, Judy,
00101 Peter:
00103 Ami:
00105 Robert:
00107 Wendy:
00109 Michael:
00110 Alvin:
00120 Alice: Blues, Edee, Kadi,
00125 Angela:
00136 Aban:
00150 Bob:
00187 Eadger:
00200 Carl: Eva,
00250 Douglass:
14 rows selected.
Как я могу избавиться от последней запятой, чтобы я мог получить вывод, подобный:
00100 Albert: Bolt, Edee, Judy
00110 Alvin:
00120 Alice: Blures, Edee, Kadi
Комментарии:
1. Что не так с использованием
listagg()
?
Ответ №1:
TRIM
IT:
return(rtrim(finalRow, ','));
Комментарии:
1. Могу ли я узнать, где я могу реализовать это в своем коде. Извините, я относительно новичок в sql.
Ответ №2:
Вы можете использовать RTRIM
, как указано в одном из ответов, но вы также можете использовать следующую логику, которая предотвратит создание таких данных.
Использование
finalRow:= finalRow || CASE WHEN SUBSTR(finalRow ,-2) <> ': ' THEN ', ' END || DEPNAME;
Вместо
finalRow:= finalRow || DEPNAME || ', ';
Ответ №3:
Используйте функцию TRIM:
create or replace function foo (s varchar2) return varchar2 is
begin
return trim (trailing ',' from s);
end;
/
var ret varchar2
exec :ret := foo ('foo,')
RET
---
foo