Изменение функции PLSQL для возврата нескольких строк из одного столбца

Я начинающий пользователь PLSQL, и у меня может быть довольно простой вопрос.

Я создал следующую функцию SQL, которая возвращает дату создания процесса, корпоративный идентификатор которого соответствует корпоративному идентификатору, который я ему дал. У меня это подключено к моему JDBC, и оно отлично возвращает значения.

Однако я только что понял, что упустил из виду важную проблему: вполне возможно, что более чем один процесс будет иметь корпоративный идентификатор, соответствующий введенному мной значению идентификатора, и в таких случаях мне нужно будет иметь доступ ко всем процессам. созданные значения даты, где идентификаторы возвращают совпадение.

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? Я просмотрел здесь другие вопросы, но ни один из них, похоже, не касался того, что мне нужно знать.

Спасибо всем, кто может помочь!


person Lamprey    schedule 21.11.2015    source источник
comment
Вы возвращаете скалярный тип. Вам нужно вернуть курсор коллекции/ссылки   -  person Lalit Kumar B    schedule 21.11.2015


Ответы (1)


вам нужно внести некоторые изменения в вашу функцию. на стороне java будет просто выбрать

  • вам нужно изменить тип вашей функции с int на collection читайте о табличных функциях здесь Табличные функции
  • пользовательская функция oracle table() для преобразования результата вашей функции в таблицу, позволяющая использовать вашу функцию в запросах. Подробнее о синтаксисе читайте здесь: Коллекции таблиц: примеры

вот пример, как вызвать вашу функцию из 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);
person are    schedule 21.11.2015
comment
Благодарю вас! Это подробно и действительно полезно, и я ценю всю информацию, которую вы также связали. Это также решило несколько других проблем, которые у меня были в других частях моего проекта. - person Lamprey; 22.11.2015