Могу ли я перенести SQL-запрос в функцию? - PullRequest
1 голос
/ 25 марта 2019

В настоящее время у меня есть несколько SQL-запросов, которые выглядят так:

Drop Table X;

Create Table X(id INTEGER);

Insert Into X
select ..
from..
where a.name = GIVENNAME;

Select SUM(..)
from ..
..
order by date desc;

И я хочу поместить все это в функцию SQL, где я могу выбрать параметр "GIVENNAME" при вызове функции.

Есть ли способ сделать это возможным?

Я бы знал, как это сделать в JSON / Java, но я действительно не представляю, как сделать это как функцию в SQL (используя Oracle).


Редактировать: После указания некоторых вещей я хочу добавить свой текущий код:

DROP TABLE TEMPTABLE;

CREATE TABLE TEMPTABLE
(mitID INTEGER);


INSERT INTO TEMPTABLE
select m.mitid
from mitarbeiter m
inner join abteilungen a on m.abt = a.abtid
where a.abtname = @GIVENNAME;


select SUM(g.kosten)
from gehaelter g
left outer join gehaelter k
on g.mitarbeiter = k.mitarbeiter 
and g.vondatum < k.vondatum
where k.mitarbeiter is null AND g.mitarbeiter in (select * from TEMPTABLE) 
order by g.vondatum desc;

Ответы [ 3 ]

0 голосов
/ 25 марта 2019

пример процедуры https://www.sitepoint.com/stored-procedures-mysql-php/ как это

DELIMITER $$

CREATE PROCEDURE `avg_sal`(out avg_sal decimal)
BEGIN
    select avg(sal) into avg_sal from salary;

END
0 голосов
/ 25 марта 2019

В настоящее время я больше заинтересован в рабочем решении, чем в хорошем и чистом

К счастью, вы можете иметь оба:

create or replace function get_sum_kosten
   ( p_givenname in abteilungen.abtname%type )
   return number
as
    return_value number;
begin
    select SUM(g.kosten)
    into return_value
    from gehaelter g
    left outer join gehaelter k
    on g.mitarbeiter = k.mitarbeiter 
    and g.vondatum < k.vondatum
    where k.mitarbeiter is null 
    AND g.mitarbeiter in (select m.mitid
                           from mitarbeiter m
                           inner join abteilungen a on m.abt = a.abtid
                           where a.abtname = P_GIVENNAME
        ) 
    ;
    return return_value;
end;
0 голосов
/ 25 марта 2019

возможно? Да. Рекомендуемые? №

Для любого DDL вам придется использовать динамический SQL (EXECUTE IMMEDIATE). Если запросы сложные, эти команды будет сложно поддерживать.

INSERT - это DML, но вы не можете использовать его в функции , если только это не автономная транзакция (и вам придется зафиксировать (или выполнить откат) внутри функции).

Если бы это была процедура , вы бы - по крайней мере - избежали последней проблемы, которую я упомянул. Если вы возвращаете что-то , используйте параметр OUT.

Вы не можете вместо этого использовать (глобальную) временную таблицу? Создайте его один раз, используйте его много раз. Я понимаю, что ваш код может быть очень сложным и, возможно, он действительно не может вписаться в один оператор SELECT, но вы должны - по крайней мере - попытаться выполнить эту работу в духе Oracle (то есть это не MS SQL Server) ,

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