Wpis z mikrobloga

#programowanie #sql
Cześć,

Potrzebuję Waszej pomocy. Niestety nie jestem biegły w sql. Mam dwie tabele:

CREATE TABLE stock_details
(
id bigserial NOT NULL,
closeprice double precision NOT NULL,
date date,
maxprice double precision NOT NULL,
minprice double precision NOT NULL,
openprice double precision NOT NULL,
volume integer NOT NULL,
stock_ticker character varying(255),
CONSTRAINT stock_details_pkey PRIMARY KEY (id),
CONSTRAINT fk_ly62pqfj6inbyk1nbmfy4dobg FOREIGN KEY (stock_ticker)
REFERENCES stocks (ticker) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

oraz:

CREATE TABLE stocks
(
ticker character varying(255) NOT NULL,
average_volume_10_days double precision,
average_volume_30_days double precision,
volume_ratio double precision,
percent_return double precision,
CONSTRAINT stocks_pkey PRIMARY KEY (ticker)
)

Teraz chciałbym sobie zrobić trigera create on stockdetails który wywoływałby 4 funkcję uzupełniające columny w tabeli stocks: averagevolume10days, averagevolume30days, volumeratio i percentreturn.
Może na sam początek tylko jedna funkcja dla percentreturn. Po dodaniu nowego wiersza do tabeli stockdetails który zawiera stockticker, dla tego stocktickera(w bazie stocks) liczyłby perecntreturn w następujący sposób. (closeprice/open_price-1)*100. Wynik z obliczenia zapisywany byłby w tabeli Stocks. Do tej pory wszystkie obliczenia robiłem na sztywno w javie, ale chciałbym skorzystać z możliwości jakie daja triggery.

Pomoże ktoś? Dzięki.
  • 10
@plushy: Gdy będę robił update rekordów z tabeli stock_details nie będę musiał updatować wartości z tabeli stocks. Bo jak rozumiem po każdym nowym dodaniu rekordu (trigger on create) będą uruchamiane napisane funkcję, które już zrobią update wartości w tabeli stocks.

Dobra mam coś takiego:

CREATE OR REPLACE FUNCTION totalRecords ()
RETURNS double precision AS $total$
declare
total double precision;
BEGIN
SELECT (closeprice/openprice-1)*100 into total FROM stock_details where stock_ticker='tpe' order by date
@pedroz: postgres. Problem jest tego typu, że skąd triger ma wiedzieć który rekord ze stocks updatować? Pseudo algorytm wygląda tak:

1. Robię insert do stockdetails z detalami (między innymi stocks) Operuję na obiektach bo projekt w javie.
2. Po insercie uruchamia się trigger.
3. Trigger wywołuję funkcję totalRecords1(parametr symbolu ze stocks);
4. Trigger robi update dla Stocks o symbolu stock
ticker z stock_details
@pulla: postgresa nie znam. "normalnie" to ty musisz napisać normalnego updatea w triggerze, ktory wykorzysta twoja funkcje. nie sądzę by tu było inaczej. trigger jest raczej on insert lub on update. skąd wziąłeś trigger on create? no i gdzie masz jego kod?
@pedroz: Tak on insert, sorry mój błąd. Właśnie póki co nie mam, bo jest to moje pierwsze spotkanie z triggerami i póki co zapoznaje się z czym to się je ;)
@pedroz: A mógłbyś mi powiedzieć co tu mam źle?

create trigger testAfter after insert on stock_details
UPDATE stocks
SET average_volume = 999
where ticker='abc'
@pulla: http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html + http://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html ogólnie różniąca polega na tym, iż twoja funkcja powinna zwracać trigger. A sam trigger wola funkcje, lecz nie dowolna, a jedna z trigger function, czyli takiej która trigger zwraca. Wartość zmieniasz poprzez new.total:= zreszta, wszystko znajdziesz w dokumentacji. Plus mała rada, jeśli nie potrzebujesz dużej precyzji, to typ danych Real jest wystarczający, a zajmuje mniej miejsca.