[PL/SQL] Funkcja wykonująca mnożenie i wpisująca wynik do innej tabeli

0

Witam, potrzebuję stworzyć funkcję która pobierze rekordy z dwóch tabel, pomnoży wartości a następnie wynik wprowadzi do kolejnej tabeli.

Udało mi się stworzyć coś takiego:

create or replace 
FUNCTION UZYTE_PALIWO
RETURN varchar2 is
spalanie float;
przebieg float;

BEGIN
  SELECT s.spalanie, e.przebieg INTO spalanie, przebieg FROM samochody s, eksploatacja e
  where s.id_samochodu = e.id_samochodu and s.id_samochodu = '7';
  return ((przebieg / 100) * spalanie);
  END;

jednak funkcja zwraca tylko wynik i to tylko jeśli podam konkretne id. Czy ktoś mógłby ją przerobić tak aby takie obliczenia wykonały się dla wszystkich rekordów a potem wyniki wpisały się do tabeli? Będę wdzięczny.

0

Przecież to się prostym insert robi

0
abrakadaber napisał(a):

Przecież to się prostym insert robi

Pewnie tak, nie siedzę w pl/sql, nie lubię baz danych, ale niestety ten projekt muszę zrobić dlatego prosiłbym o konkrety bo niestety "prosty insert" nic mi nie mówi. Tak wiem, że składnia to insert into tabela(kolumna) values (wartosc) ale jak w stworzyłem "Insert into eksploatacja(zuzyte_paliwo) values (wynik) to nie działa. No i kolejne, że w tej funkcji nie może być "s.id_samochodu = '7'" bo ma to robić dla wszystkich rekordów a nie tylko dla tego jednego.

Stworzyłem coś takiego:

create or replace 
FUNCTION UZYTE_PALIWO
RETURN varchar2 is
spalanie float;
przebieg float;
wynik float;

BEGIN
  SELECT s.spalanie, e.przebieg INTO spalanie, przebieg FROM samochody s, eksploatacja e
  where s.id_samochodu = e.id_samochodu and s.id_samochodu = '7';
  wynik:= ((przebieg / 100) * spalanie);
  UPDATE eksploatacja SET zuzyte_paliwo = wynik WHERE id_samochodu='7';
  return wynik;
END;

ale nadal funkcja wykonuje się tylko dla samochodu o ID 7, nie potrafię zrobić żeby wykonywała się dla wszystkich rekordów.

0

Moim zdaniem ta funkcja:

  • nie powinna modyfikować danych, tylko coś przeliczać i zwracać wynik
  • na wejściu dostawać ID_SAMOCHODU, a na wyjściu obliczone zużycie (albo NULL jeśli nie ma takiego samochodu)

Aktualizacja danych mogłaby wygląda tak:

UPDATE eksploatacja SET zuzyte_paliwo=UZYTE_PALIWO(id_samochodu);

Rozumiem, że chodziło jedynie o przećwiczenie wywoływania funkcji, bez wnikania, czy to ma sens, czy nie, ale...

Jeśli coś można zrobić bez PL/SQLa (w samym SQLu), to wydajnościowo pchanie się w funkcje jest bez sensu. Oracle potrafi cache'ować wyniki wywołań funkcji (przez dodanie do definicji funkcji klauzuli RESULT_CACHE). W Twoim przypadku, do wyliczenia i aktualizacji wykorzystywany jest ten sam obiekt... Brawo, takim designem zabiłeś możliwość włączenia funkcjonalności cache ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1