【问题标题】:Modifying PLSQL function to return multiple rows from same column修改 PLSQL 函数以从同一列返回多行
【发布时间】:2016-02-23 18:25:01
【问题描述】:

我是 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 过程或仅结合 JDBC 的普通 SQL 返回我需要的内容?我在这里查看了其他问题,但似乎没有一个是我需要知道的。

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

【问题讨论】:

  • 您正在返回标量类型。您需要返回一个集合/引用光标

标签: java oracle jdbc plsql oracle12c


【解决方案1】:

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

  • 您需要将函数的类型从 int 更改为 collection 在此处阅读有关表函数的信息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);

【讨论】:

  • 谢谢!这是详细且非常有用的,我也感谢您链接的所有信息。这也解决了我在项目其他部分遇到的一些其他问题。
猜你喜欢
  • 2022-06-18
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
相关资源
最近更新 更多