Вернуть несколько значений в varchar2 - PullRequest
0 голосов
/ 05 февраля 2020

Я хочу вернуть значения нескольких столбцов (с функцией) в varchar2, но я получаю ошибку, когда выбираю несколько столбцов в select.

FUNCTION FU_PRUEBAS (P_IDNUM MAC.IDNUM%TYPE) RETURN VARCHAR2 IS REGISTRO VARCHAR2(100);
     BEGIN
     select NOMBRES, FECHANACIMIENTO INTO REGISTRO
     from MAC WHERE IDNUM = P_IDNUM;
     RETURN REGISTRO;

Ошибка:

Ошибка (17,6): PL / SQL: SQL Оператор игнорируется

Ошибка (18,6): PL / SQL: ORA-00947: недостаточно значений

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Два относительно простых варианта - если они удовлетворяют вашим потребностям. Вы действительно не объяснили, что вы ожидаете получить в результате, поэтому - это может или не может быть применимо к вашей ситуации.

В любом случае, здесь вы go:

Первый вариант использует функцию listagg, которая возвращает объединенную строку (как вы хотели вернуть varchar2). Недостатком является то, что он не будет работать для результата длиннее 4000 символов, но - в этом случае - вы можете использовать XMLAGG.

SQL> create or replace function fu_pruebas (par_deptno in number)
  2    return varchar2
  3  is
  4    retval varchar2(200);
  5  begin
  6    select listagg(ename, ', ') within group (order by ename)
  7      into retval
  8      from emp
  9      where deptno = par_deptno;
 10    return retval;
 11  end;
 12  /

Function created.

SQL> select fu_pruebas(10) result from dual;

RESULT
------------------------------------------------------------------------------
CLARK, KING, MILLER

SQL>

Еще один объединяет различные столбцы в строку; в некоторых случаях вам может понадобиться использовать, например, функции to_char или to_date, но, как правило, это работает следующим образом:

SQL> create or replace function fu_pruebas_2 (par_empno in number)
  2    return varchar2
  3  is
  4    retval varchar2(200);
  5  begin
  6    select ename ||' - '|| job ||' - '|| sal
  7      into retval
  8      from emp
  9      where empno = par_empno;
 10    return retval;
 11  end;
 12  /

Function created.

SQL> select fu_pruebas_2(7654) result from dual;

RESULT
------------------------------------------------------------------------------
MARTIN - SALESMAN - 1250

SQL>
0 голосов
/ 05 февраля 2020

если вам нужен ретранр с несколькими значениями, вам нужен правильный объект

  create or replace
     type your_obj as object
       ( val_1 varchar2(200),
         val_2 varchar2(200)
       );

затем

  FUNCTION FU_PRUEBAS (P_IDNUM MAC.IDNUM%TYPE) RETURN VARCHAR2 IS REGISTRO VARCHAR2(100);
     BEGIN
     select NOMBRES, FECHANACIMIENTO INTO your_var1, your_var2
     from MAC WHERE IDNUM = P_IDNUM
     RETURN your_obj(your_var1, your_var2)
     END;
...