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

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

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.

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.

0

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

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 
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.

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?

1
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
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:

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
0

Coś w ten desen:

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

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