Pokazywanie postów oznaczonych etykietą funkcje. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą funkcje. Pokaż wszystkie posty

2013-01-10

[psql] Wyciągnięcie id z inserta i wykorzystanie go w innym insercie

Tym razem problem SQL'owy. Miałem dziś potrzebę stworzenia zapytania, które rozpisze dane z pewnej tabeli do dwóch powiązanych ze sobą tabel. Potrzebowałem w tym celu id zapisywanej pozycji aby móc ją wykorzystać w innym insercie. Tutaj z pomocą przyszła mi możliwość utworzenia w PostgreSQL funkcji oraz triggerów. Jako pierwsze stworzyłem funkcję insert_po_insercie() za pomocą której dokonuję operacji na tej drugiej tabeli (posiadając już id):
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  return new;
end;
$$ language plpgsql;
Później stworzyłem triggera insert_po_insercie, który wygląda tak:
create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();
Widać tutaj, że po insercie do tabeli table_01 wywoływana jest funkcja insert_po_insercie(). Mając już tak funkcję i triggera można wykonać inserty do tabeli table_01:
INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
W funkcji przy tworzeniu inserta skorzystałem z świeżo utworzonego id (new.id) oraz przy okazji idp (new.idp), które również było mi potrzebne. Można w ten sposób pobierać dowolną kolumnę z tabeli źródłowej. Funkcja poza pokazanym na przykładzie insertem może robić wiele innych czynności. Na przykład po insercie można umieścić update do jeszcze innej tabeli, w której z kolei skorzystamy z id nowoutowrzonego inserta:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;
Całość wygląda zatem tak:
create function insert_po_insercie()
  returns trigger
as $$
begin
  insert into table_02 (ido, idm, komentarz, idp, idupr, iddest) values ('0', '0', 'testowy komentarz', new.idp, (select id from upr where kod='ewus'), new.id);
  update table_03 set idx=currval('table_02_id_seq'::regclass) where id=new.id;
  return new;
end;
$$ language plpgsql;

create trigger insert_po_insercie
  after insert on table_01
for each row
execute procedure insert_po_insercie();

INSERT INTO table_01 (id_operacji, data_czas_operacji, idp) SELECT id_operacji, data_czas_operacji, idp FROM guilty_table;
Pozdrawiam!

2012-10-02

[psql] Funkcja replace

Jeśli masz potrzebę zmiany ciągu znaków bezpośrednio w PostgreSQL to możesz tego dokonać przy pomocy funkcji replace. Możesz dzięki tej funkcji zamienić znaki nowej linii oraz inne znaki specjalne - wystarczy, że skorzystasz z literki E.

Dla przykładu przedstawiam funkcję zamieniającą znak nowej linii na spację:

replace(przykladowa_kolumna, E'\n','')

2010-12-08

[psql] Prosta funkcja w PostgreSQLu

PostgreSQL umożliwia tworzenie funkcji - poniżej można zobaczyć na prostym przykładzie jak tego dokonać:

CREATE OR REPLACE FUNCTION prosta_funkcja(pierwsza_zmienna integer, druga_zmienna integer) RETURNS void AS
$$
BEGIN
INSERT INTO jakas_tabela (dodata, modata, idoper, kod, nazw) SELECT now() as dodata, now() as modata, $2 as idoper, kod, nazw FROM jakas_tabela WHERE idoper=$1;
END;
$$ LANGUAGE plpgsql;

To taki zupełnie prosty przykład - więcej można znaleźć w dokumentacji.
Szczegóły funkcji można w każdej chwili sobie obejrzeć za pomocą komendy

\dt prosta_funkcja

2010-12-06

[jQuery] $.get() i wykorzystanie danych w innej funkcji

Funkcja $.get() daje bardzo fajną możliwość wykorzystania świeżo pobranych danych w innej funkcji:

function wczytajCos(){
$.get('cos.php?cl=foo', zrobCos);
}

function zrobCos(data){
alert(data);
}

Jak łatwo się domyśleć funkcja wczytajCos() prześle zmienną foo w tablicy $_GET do strony cos.php i uruchomi funkcję zrobCos(), która z kolei wyświetli w alercie wynik tej akcji.

2010-11-23

[jQuery] Pobranie wartości do Greyboxa

Za pomocą top.window można z łatwością pobrać w jQuery wartość ze strony znajdującej się "pod" okienkiem Greybox'a:

var datawiz = top.window.$("#datawiz").val();

2010-08-16

[jQuery] Nowy View Large On Black i .one()

Niedawno zmienił się layout galerii Flickr i przestał mi działać skrypcik View Large On Black, o którym pisałem tutaj.
Modyfikując skrypt natknąłem się na fantastyczną funkcję jQuery .one(). Dzięki .one() można w prosty sposób zdefiniować, aby jakieś zdarzenie mogło być wykonane tylko jeden raz. Można oczywiście tego typu zabieg wykonać również za pomocą .bind() i .unbind() ale .one() jest znacznie bardziej "eleganckie".
Nowy skrypt View Large On Black - i przy okazji zastosowanie funkcji .one() - można obejrzeć pobierając plik stąd.

2010-07-22

[psql] Obliczanie wieku funkcją age() i date_part()

Funkcja age() w Postgresie to bardzo fajna sprawa. Za pomocą niej można w prosty sposób obliczyć wiek użytkownika.
Zapytanie:

SELECT age(data_ur) as wiek FROM user WHERE id=1;

(gdzie data_ur jest typu date) może dać wynik:

wiek
-------------------------
6 years 11 mons 21 days

Jeśli chcielibyśmy się dowiedzieć ile użytkownik miał lat na przykład 21 kwietnia 2009 roku wystarczy napisać:

SELECT age(timestamp '2009-04-21', data_ur) as wiek FROM user WHERE id=1;

co da wynik w postaci:

wiek
------------------------
5 years 8 mons 20 days

Za pomocą funkcji date_part() można w prosty sposób "wyciągnąć" z wyniku np. jedynie ilość lat (bez informacji o miesiącach i dniach):

SELECT date_part('year', age(timestamp '2009-04-21', data_ur)) as wiek FROM user WHERE id=1

wynik:

wiek
------
5

2010-01-13

[psql] Grupowanie i funkcja min()

Funkcja min() PostgreSQL'a w połączniu z grupowaniem daje bardzo fajną użyteczność.
Załóżmy, że mamy trzy tabele: ojciec, dziecko i powiazanie. Jeden rodzic może mieć wiele dzieci: