当前,我有一些类似以下的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;
答案 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