Превратить оператор SQL в функцию - PullRequest
0 голосов
/ 08 ноября 2018

Как заменить конкретное значение переменной в Oracle SQL? У меня

 select 5, min(id) from my_table where id > 5 --AND ..
 UNION ALL     
 select 6, min(id) from my_table where id > 6  --AND ..
 UNION ALL
 ....  

 | 5 | 6 |
 | 6 | 8 |
 ...

Как обернуть это в функцию, выполняющую псевдокод ниже?

for ( $i in ( select id from my_table)){
    UNION ALL
    select $i, min(id) from my_table where id > $i 
}

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


Edit2:
Позвольте мне перевести это на Java. Вопрос: у меня есть код

  System.out.println(1+2+" = 1+2"+ " ");

, который возвращает сумму двух чисел. Как заменить бетон 1 + 2 на любые a и b?
Ответ:
Вам нужно определить

   int getSum(int a, int b){ return a+b;}  

Теперь вы можете написать

for(int a : setA){    
    for(int b : setB){    
        System.out.println(" " +a+"+"+b+" = "+ getSum(a,b)+" ");    
        }}   

Таким образом, вы можете перебирать все элементы setA и все элементы setB вместо предоставления конкретных значений 1 и 2.

У меня точно такой же вопрос для SQL. Если у меня есть запрос, который возвращает результат для конкретного значения (пример Java: 1, 2; пример SQL: where id > 6) - как изменить его так, чтобы SQL перебрал все возможные значения (полученные из select id из группы т по id)?

1 Ответ

0 голосов
/ 08 ноября 2018

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

select
  t.id,
  lead(t.id) over (order by t.id) as next_id
from
  my_table t

Если вы хотите вернуть его из функции, вам, вероятно, понадобится табличная функция, возвращающая пользовательский тип таблицы, поскольку возвращаемый тип строки не соответствует вашей структуре таблицы, поэтому вы не можете использовать my_table%rowtype.

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

-- Define a row type (an object). 
create or replace type my_row_type as object (
  id int,
  next_id int
);

-- Define a table type of that row type
create type my_table_type as table of my_row_type;

-- Create a function that returns a table. 
create or replace function my_function
return my_table_type
is
  result my_table_type;
begin
  select
    -- Use the rowtype constructor to put the id and next_id into a row object
    my_row_type(
      t.id,
      lead(t.id) over (order by t.id))
  -- use bulk collect into to query all rows into the table variable 'result'
  bulk collect into
    result
  from
    my_table t;

  -- Don't forget to actually return it.
  return result;
end;
/

-- Query it by 'casting' the function result to a table.
select
  id,
  next_id
from
  table(my_function);

Для получения дополнительной информации о табличных функциях, я думаю, этот урок / статья - хорошее начало:

http://stevenfeuersteinonplsql.blogspot.com/2015/04/table-functions-introduction-and.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...