Избавление от запятой в конце функции PL / SQL [Oracle PL / SQL]

#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