Dodanie i używanie funkcji zdefiniowanej przez użytkownika (PostgreSQL)

Dodanie i używanie funkcji zdefiniowanej przez użytkownika (PostgreSQL)
mpaw
  • Rejestracja:około 9 lat
  • Ostatnio:25 dni
  • Postów:530
0

Dzień dobry.

Czy istnieje możliwość, aby zdefiniować funkcję SQL, napisaną przez użytkownika, z poziomu bazy, do której można będzie się odwoływać, z poziomu kodu C++?
Innymi słowy, czy mogę dodać nową funkcję SQL, do danej bazy, którą potem będę mógł wywoływać, w zapytaniu, czy to z poziomu Shella, czy z poziomu kodu C++, używającego danej bazy?

Dzięki


That's all folks ;)
DR
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 6 lat
  • Postów:683
0
mpaw napisał(a):

Dzień dobry.

Czy istnieje możliwość, aby zdefiniować funkcję SQL, napisaną przez użytkownika, z poziomu bazy, do której można będzie się odwoływać, z poziomu kodu C++?
Innymi słowy, czy mogę dodać nową funkcję SQL, do danej bazy, którą potem będę mógł wywoływać, w zapytaniu, czy to z poziomu Shella, czy z poziomu kodu C++, używającego danej bazy?

Dzięki

Tak. Służy do tego zapytanie CREATE FUNCTION. Zobacz dokumentację: https://www.postgresql.org/docs/9.1/static/sql-createfunction.html. Z poziomu kodu c++ musisz zrobić zapytanie które zwróci ci wyniki. W linku który podałem wszystko jest napisane.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 3 godziny
  • Postów:1597
0

Oczywiście, że możesz pod warunkiem, że aplikacja w C++ będzie mogła połączyć się z daną bazą danych i user (bazodanowy) na którego będzie się logować Twoja aplikacja będzie miała uprawnienia do uruchomienia tej funkcji.

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 15 godzin
  • Postów:2792
0

@mpaw: Można, a na dodatek można zarówno przed, jak i po FROM.

Kopiuj
create function foo(IN int) returns int as 'select 2*$1' language sql cost 1;

select foo(1) x; -- zwróci 2
SELECT * from foo(2); -- zwróci 4;
SELECT foo(x) FROM foo(4) x(x); -- zwróci 16 
mpaw
  • Rejestracja:około 9 lat
  • Ostatnio:25 dni
  • Postów:530
0

Dziękuję za odpowiedzi.

Próbuję napisać funkcję, zwracającą sformatowany adres, na podstawie kilku pól, takich jak, ulica, numerdomu/mieszkania, miasto, kod, etc. Ale gdzieś jest błąd i nie wiem gdzie.

Kopiuj
CREATE OR REPLACE FUNCTION zwrocadres(int, int default 1) RETURNS text
AS 'SELECT ulica || ' ' || numerDomu || '/' || numerMieszkania || ', ' || kodPocztowy || ' ' || miasto || ', ' || wojewodztwo || ', ' || kraj FROM adreskorespondencji
WHERE id = $1;' 
LANGUAGE SQL

Gdzie tu jest błąd?


That's all folks ;)
edytowany 1x, ostatnio: mpaw
Marcin.Miga
SELECT ulica || '' '' || ... Poza tym daj wszędzie Coalesce
mpaw
Co masz na myśli? (bez apostrofu?)
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 15 godzin
  • Postów:2792
1
Kopiuj
CREATE OR REPLACE FUNCTION zwrocadres(INT, INT DEFAULT 1) RETURNS text
AS 
$$
SELECT Coalesce(ulica, '') || ' ' || Coalesce(numerDomu, '') || Coalesce('/' || numerMieszkania, '') || ', ' || Coalesce(kodPocztowy || ' ', '') || Coalesce(miasto, '') || ', ' || Coalesce(wojewodztwo || ', ', '') || Coalesce(kraj, '') FROM adreskorespondencji
WHERE id = $1;
$$
LANGUAGE SQL
Marcin.Miga
A po co ci drugi parametr?
mpaw
bo mam 3 rodzaje adresów (Korespondencji, Zamieszkania i Zameldowania), w zależności od wartości 2 parametru będę wybierać dane z odpowiedniej tabeli
Marcin.Miga
Zamien to na jedna tabele, dodaj pole typ. unikniesz wielu problemow. jak ten ponizej
Marcin.Miga
Ew. zrob view zlozone z tych trzech tabel (po UNION)
mpaw
  • Rejestracja:około 9 lat
  • Ostatnio:25 dni
  • Postów:530
0

Mam jeszcze pytanie.
Zmodyfikowałem nieco funkcję, ustawiając 2 parametr na parametr typu text, ale gdzieś znów mam błąd. Proszę o pomoc:

Kopiuj
CREATE OR REPLACE FUNCTION zwrocadres(INT, TEXT) RETURNS text
AS
$$ SELECT COALESCE(ulica, '') || ' ' || COALESCE(numerDomu, '') || COALESCE('/' || numerMieszkania, '') || ', ' || COALESCE(kodPocztowy || ' ', '') || COALESCE(miasto, '') || ', ' || COALESCE(wojewodztwo || ', ', '') || COALESCE(kraj, '') FROM $2
WHERE id = $1;
$$
LANGUAGE SQL

That's all folks ;)
mpaw
Z tego, co się doczytałem, wynika, że wymagany jest do tego dynamiczny SQL. Że trzeba zbudować zapytanie w stringu, a potem wywołać. Ale jak?
Marcin.Miga
kazy apostrof musisz zamienic na dwa apostrofy i calosc dac w apostrofach. Oprocz nazwy tabeli, ktora normalnie dodajesz. i to podstawiasz do jakiejs zmiennej, z ktorej potem robisz query execute. Ale to juz funkcja musi byc w plpgsql.
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 15 godzin
  • Postów:2792
0

Coś w ten desen:

Kopiuj
CREATE OR REPLACE FUNCTION zwrocadres(INT, TEXT) RETURNS text
AS
$$ 
declare s text= '';
wynik text ='';
begin
s='SELECT COALESCE(ulica, '''') || '' '' || COALESCE(numerDomu, '''') || COALESCE(''/'' || numerMieszkania, '''') || '', '' || COALESCE(kodPocztowy || '' '', '''') || COALESCE(miasto, '''') || '', '' || COALESCE(wojewodztwo || '', '', '''') || COALESCE(kraj, '''') FROM '
||
$2
||
' WHERE id = ' || $1::TEXT;
execute s into wynik;
return wynik;
end;
$$
LANGUAGE pgplsql cost 1
mpaw
Bardzo dziękuję, działa. Jedyny błąd, to literówka, na samym końcu (powinno być plpgsql)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.