Функция, которая возвращает запрос

#sql #oracle #plsql #oracle-sqldeveloper

Вопрос:

Это и есть функция :

 create or replace function searchbyid (depto in departments.department_id%type) 

return sys_refcursor 

is result_s sys_refcursor; 

begin 

open result_s for 

SELECT 

a.employee_id, 

a.first_name, 

a.last_name, 

a.phone_number, 

a.salary, 

b.department_id, 

b.end_date 

FROM 
employees a
 
FULL JOIN job_history b ON a.department_id = b.department_id 

WHERE b.department_id = depto; 

return result_s; 

end;
 

Я получаю вывод в одной строке, можно ли получить в виде таблицы?
ВЫВОД ФУНКЦИИ :

Да, я использую SQL Developer

Комментарии:

1. Я думаю, что вы ищете курсор ссылки

Ответ №1:

Один из вариантов-использовать курсор ссылки (как прокомментировал Абра). У меня нет ваших столов, поэтому я воспользовался столами Скотта.

 SQL> create or replace function searchbyid (par_deptno in dept.deptno%type)
  2  return sys_refcursor
  3  is
  4    rc sys_refcursor;
  5  begin
  6    open rc for
  7      select d.deptno, d.dname, e.ename, e.job, e.sal
  8      from emp e join dept d on d.deptno = e.deptno
  9      where d.deptno = par_deptno;
 10
 11    return rc;
 12  end;
 13  /

Function created.

SQL> select searchbyid(10) result from dual;

RESULT
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

    DEPTNO DNAME          ENAME      JOB              SAL
---------- -------------- ---------- --------- ----------
        10 ACCOUNTING     CLARK      MANAGER         2450
        10 ACCOUNTING     KING       PRESIDENT       5000
        10 ACCOUNTING     MILLER     CLERK           1300


SQL>
 

Другой вариант-конвейерная функция:

Типы сначала:

 SQL> create or replace type t_row as object
  2    (deptno    number,
  3     dname     varchar2(10),
  4     ename     varchar2(10),
  5     job       varchar2(10),
  6     sal       number
  7    );
  8  /

Type created.

SQL> create or replace type t_tab is table of t_row;
  2  /

Type created.
 

Функция:

 SQL> create or replace function searchbyid (par_deptno in dept.deptno%type)
  2    return t_tab pipelined
  3  is
  4  begin
  5    for cur_r in (select d.deptno, d.dname, e.ename, e.job, e.sal
  6                  from emp e join dept d on d.deptno = e.deptno
  7                  where d.deptno = par_deptno
  8                 )
  9    loop
 10      pipe row (t_row(cur_r.deptno, cur_r.dname, cur_r.ename, cur_r.job, cur_r.sal));
 11    end loop;
 12    return;
 13  end;
 14  /

Function created.

SQL> select * from table(searchbyid(10));

    DEPTNO DNAME      ENAME      JOB               SAL
---------- ---------- ---------- ---------- ----------
        10 ACCOUNTING CLARK      MANAGER          2450
        10 ACCOUNTING KING       PRESIDENT        5000
        10 ACCOUNTING MILLER     CLERK            1300

SQL>
 

[РЕДАКТИРОВАТЬ, после того, как вы отредактировали вопрос]

Снимок экрана показывает, как выглядят данные, когда функция возвращает курсор ссылки в SQL Developer. Если вы хотите, чтобы это было красиво, прокрутите вправо и щелкните значок карандаша; что-то вроде этого:

(нажмите на (1), чтобы получить результат как (2))

Комментарии:

1. Это работает, но показывает все в одной строке, можно ли показать в виде таблицы?

2. Прошу прощения? Что находится в одной строке? В моем примере есть 3 строки.

3. Вот результат, который я получаю: {<EMPLOYEE_ID=201,FIRST_NAME=Michael,LAST_NAME=Hartstein,PHONE_NUMBER=515.123.5555,SALARY=13000,DEPARTMENT_ID=20,END_DATE=19-DEC-07>,<EMPLOYEE_ID=201,FIRST_NAME=Michael,LAST_NAME=Hartstein,PHONE_NUMBER=515.123.5555,SALARY=13000,DEPARTMENT_ID=20,END_DATE=19-DEC-07><EMPLOYEE_ID=202,FIRST_NAME=Pat,LAST_NAME=Fay,PHONE_NUMBER=603.123.6666,SALARY=6000,DEPARTMENT_ID=20,END_DATE=19-DEC-07>,} Мое шоу похоже на это. Все в одной строке.

4. Это мой код : создайте или замените функцию searchbyid (depto в типе department_id%). возвращаемый sys_refcursor-это result_s sys_refcursor; начните открывать result_s для ВЫБОРА.идентификатор сотрудника, имя, фамилия, номер телефона, зарплата, b.идентификатор отдела, b.конечная дата ОТ сотрудников a ПОЛНАЯ история вакансий в a.department_id = b.department_id, ГДЕ b.department_id = depto; возвращает result_s; конец;

5. Как вы, вероятно, видите, это нечитабельно. Пожалуйста, опубликуйте эту информацию (в правильном формате), отредактировав исходное сообщение, которое вы опубликовали (сам вопрос). Если вы считаете, что снимок экрана лучше иллюстрирует это, прикрепите его также. Кстати, каким инструментом вы пользуетесь? Это разработчик SQL (как вы использовали этот тег)?