#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 (как вы использовали этот тег)?