【问题标题】:Fetch multiple rows with PL/SQL procedure使用 PL/SQL 过程获取多行
【发布时间】:2020-04-18 12:23:39
【问题描述】:

程序:

create or replace PROCEDURE employee_project1 (
  emp_id   in  EMPLOYEES.EMPLOYEE_ID%TYPE,
  cur      out SYS_REFCURSOR
)
IS
BEGIN
  OPEN cur FOR
    SELECT p.project_id,
           p.project_name
    FROM   employees e
           INNER JOIN departments d
           ON ( e.department_id = d.department_id )
           INNER JOIN projects p
           ON ( p.department_id = e.department_id)
    WHERE  e.employee_id = emp_id;
END;

这个程序对我有用。我正在使用以下代码执行该过程:

执行:

declare
    cur SYS_REFCURSOR;
    pro_id int;
    pro_name projects.project_name%TYPE;
begin
    employee_project1(43, cur);
    loop
        fetch cur into pro_id, pro_name;
        exit when cur%NOTFOUND;
        dbms_output.put_line(pro_id||' '||pro_name);
    end loop;
end;

我必须用 JDBC 调用 java 中的过程。那么如何通过上面的执行代码调用java中的过程呢?

【问题讨论】:

标签: sql oracle stored-procedures plsql


【解决方案1】:

使用集合(您可以使用CREATE TYPE ... AS TABLE OF ... 创建)或VARRAY(如内置的VARRAYs SYS.ODCI*LIST)和BULK COLLECT INTO

CREATE PROCEDURE employee_project (
  emp_id    in  EMPLOYEES.EMPLOYEE_ID%TYPE,
  pro_ids   out SYS.ODCINUMBERLIST,
  pro_names out SYS.ODCIVARCHAR2LIST
)
IS
BEGIN
  SELECT p.project_id,
         p.project_name
  BULK COLLECT INTO
         pro_ids,
         pro_names
  FROM   employees e
         INNER JOIN departments d
         ON ( e.department_id= d.department_id )
         INNER JOIN projects p
         ON ( p.department_id = d.department_id)
  WHERE  e.employee_id = emp_id;
END;
/

或者只返回光标(不带INTO 子句):

CREATE PROCEDURE employee_project (
  emp_id   in  EMPLOYEES.EMPLOYEE_ID%TYPE,
  cur      out SYS_REFCURSOR
)
IS
BEGIN
  OPEN cur FOR
    SELECT p.project_id,
           p.project_name
    FROM   employees e
           INNER JOIN departments d
           ON ( e.department_id= d.department_id )
           INNER JOIN projects p
           ON ( p.department_id = d.department_id)
    WHERE  e.employee_id = emp_id;
END;
/

【讨论】:

  • 第二个程序对我有用,但我在 java 中执行。那么如何使用 aboce 执行代码在 java 中调用该过程呢? (编辑问题) @MT0
  • @DarshakChavda 关于如何使用 JDBC 从过程返回游标有很多答案 (like this one)。还有其他答案 (like this one) 关于如何使用 JDBC 将数组传入/传出过程。我相信您可以通过搜索找到更多信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2023-04-09
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2014-06-14
相关资源
最近更新 更多