我可以将SQL查询转换为功能吗?

时间:2019-03-25 18:00:57

标签: sql database oracle function

当前,我有一些类似以下的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 :(得分:0)

可能吗?是。推荐的?否

对于任何DDL,您都必须使用动态SQL(EXECUTE IMMEDIATE)。如果查询很复杂,那么这些命令将很难维护。

INSERT是DML,但是您不能在函数中使用它,除非它是一个自主事务(并且您必须在内部执行(或回滚))功能)。

如果这是一个过程,则您-至少-避免了我提到的最后一个问题。如果要返回某物,请使用OUT参数。

您不能使用(全局)临时表吗?创建一次,多次使用。我了解您的代码可能非常复杂,也许确实不能放入单个SELECT语句中,但是您至少应该本着Oracle的精神(即,不是MS SQL)来完成这项工作。服务器)。

答案 1 :(得分:0)

  

我现在对一种可行的解决方案更感兴趣,而不是一个干净整洁的解决方案

幸运的是,您可以同时拥有:

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;

答案 2 :(得分:-1)

过程的示例 https://www.sitepoint.com/stored-procedures-mysql-php/ 像这样

git pull