修改PLSQL函数以从同一列返回多行

时间:2015-11-21 07:03:59

标签: java oracle jdbc plsql oracle12c

我是初学者PLSQL用户,我有一个可能是一个相当简单的问题。

我创建了以下SQL函数,该函数返回其公司ID与我提供的公司ID匹配的进程的创建日期。我将它连接到我的JDBC,它返回值就好了。

然而,我刚刚意识到我忽略了一个重要的问题 - 完全有可能不止一个进程的公司ID与我输入的ID值相匹配,在这种情况下,我需要能够访问ID返回匹配的所有创建日期值。

CREATE OR REPLACE FUNCTION FUNCTION_1(
    c_id IN INT)
  RETURN INT
AS
  p_date process.date_created%TYPE;
BEGIN
  SELECT process.date_created
  FROM PROCESS
  WHERE process.corporate_id = c_id
  ORDER BY process.corporate_id;
  RETURN p_id;
END FUNCTION_1;
/

有没有办法可以修改我的函数从同一列返回多行,然后使用JDBC调用该函数返回某种数组?或者,如果那是不可能的,有没有办法可以使用PLSQL程序或只是简单的SQL结合JDBC返回我需要的东西?我在这里看了其他问题,但似乎没有一个我需要知道的事情。

感谢任何可以提供帮助的人!

1 个答案:

答案 0 :(得分:1)

您需要对功能进行一些更改。在java方面,它将是简单的选择

  • 您需要更改自intcollection的功能类型 在这里阅读有关表格函数的Table Functions
  • 用户oracle table()函数将函数的结果转换为表 它允许您在查询中使用您的函数。在此处详细了解语法:Table Collections: Examples

这里是如何从java调用你的函数的例子:

select t.column_value as process_id 
      from  table(FUNCTION_1(1)) t

--result
    PROCESS_ID
1   1
2   2


--we need create new type - table of integers
CREATE OR REPLACE TYPE t_process_ids IS TABLE OF int;

--and make changes in function
CREATE OR REPLACE FUNCTION FUNCTION_1(
    c_id IN INT)
  RETURN t_process_ids
AS
  l_ids  t_process_ids := t_process_ids();
BEGIN
  --here I populated result of select into the local variables
  SELECT process.id
  bulk collect into l_ids
  FROM PROCESS
  WHERE process.corporate_id = c_id
  ORDER BY process.corporate_id;

  --return the local var
  return l_ids;
END FUNCTION_1;

--the script that I used for testing
create table process(id int, corporate_id int, date_created date);
insert into process values(1, 1, sysdate);
insert into process values(2, 1, sysdate);
insert into process values(3, 2, sysdate);