【问题标题】:Function that returns a query返回查询的函数
【发布时间】:2021-12-22 17:38:43
【问题描述】:

这是函数:

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

【问题讨论】:

标签: sql oracle plsql oracle-sqldeveloper


【解决方案1】:

一种选择是使用参考光标(正如 Abra 评论的那样)。我没有你的桌子,所以我用了 Scott 的。

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 中返回 ref 游标时数据的样子。如果您想很好地看到它,请滚动到最右侧并单击铅笔图标;像这样:

(点击(1)得到结果为(2))

【讨论】:

  • 它有效,但它在一行中显示所有内容,是否可以显示为表格?
  • 请问?什么是单行?在我的示例中,有 3 行。
  • 这是我得到的输出:{,,} 我的显示是这样的。一切都在一行中。
  • 这是我的代码:创建或替换函数 searchbyid (depto in department.department_id%type) return sys_refcursor is result_s sys_refcursor;开始为 SELECT a.employee_id、a.first_name、a.last_name、a.phone_number、a.salary、b.department_id、b.end_date 打开 result_s 来自员工 a FULL JOIN job_history b ON a.department_id = b.department_id WHERE b。部门ID =部门;返回结果_s;结束;
  • 如您所见,这是不可读的。请通过编辑您发布的原始消息(问题本身)发布该信息(格式正确)。如果您认为该屏幕截图更好地说明了它,请将其附上。顺便问一下,您使用哪种工具?是 SQL Developer(就像你使用的那个标签)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2018-04-09
  • 2017-09-10
  • 2015-04-07
  • 1970-01-01
相关资源
最近更新 更多