/ / Jak napisać i wywołać funkcję Oracle w SQL - oracle, plsql

Jak napisać i wywołać funkcję Oracle w SQL - oracle, plsql

Mam dwie tabele Oracle o podobnej strukturze:

wprowadź opis obrazu tutaj

„Chciałbym napisać funkcję w Oracle, która sumuje wszystkie wartości dla każdego identyfikatora i zwraca parę (identyfikator, tekst), gdzie tekst =„ ALERT ”, jeśli suma jest większa niż 100, w przeciwnym razie„ OK ”:

wprowadź opis obrazu tutaj

Następnie chciałbym wykonać zapytanie dla każdej tabeli, na przykład coś takiego:

SELECT MY_FUN() FROM TABLE_1
SELECT MY_FUN() FROM TABLE_2

Czy to właściwe podejście? Jak mogę napisać tę funkcję?

Dzięki

Odpowiedzi:

2 dla odpowiedzi № 1

Zasadniczo uważa się za złą praktykę wywoływanie funkcji w SQL, która wykonuje SQL. To stwarza różnego rodzaju problemy.

Oto jedno rozwiązanie:

create or replace function my_fun
( p_sum in number) return varchar2 is
begin
if p_sum > 100 then return "ALERT";
else return "OK";
end if;
end;
/

Uruchom to tak:

select id, my_fun(sum(val)) as state
from your_table
group by id;

0 dla odpowiedzi nr 2

Możesz to zrobić w sql, jak poniżej. Jeśli chcesz utworzyć do tego funkcję dla różnych tabel, możesz zawinąć to w funkcję, która pobiera nazwę tabeli i uruchomić zapytanie za pomocą dynamicznego SQL, ale jesteś ograniczony do tych samych kolumn.

-- begin test data
with test_data(id, value) as
(select 1, 100 from dual union all
select 1, 50 from dual union all
select 2, 75 from dual union all
select 3, 50 from dual union all
select 3, 51 from dual)
-- end test data
select id, sum(value),
case when sum(value) > 100 then "ALERT"
else "OK" end AS alert
from test_data
group by id;