store procedure with PostgreSQL
4 отговора
691 прегледа
store procedure with PostgreSQL
imam slednoto pitane
kak moej da se napishe suhraneta procedura v Postgre koqto da vurne mnojestwo ot zapisi pri uzlovie 4e se izpolzwa za ezik PL/pgSQL.
samo 4rez SQL nqma problem, za towa no ako iskam da vkaram nqkakwi uslownosti vutre v prozedurata mi trqbwa PL/pgSQL i v v sledstwie na tezi uslownosti da naprawq Select koito da mi vru6ta mnojeswo zapisi.
kak moej da se napishe suhraneta procedura v Postgre koqto da vurne mnojestwo ot zapisi pri uzlovie 4e se izpolzwa za ezik PL/pgSQL.
samo 4rez SQL nqma problem, za towa no ako iskam da vkaram nqkakwi uslownosti vutre v prozedurata mi trqbwa PL/pgSQL i v v sledstwie na tezi uslownosti da naprawq Select koito da mi vru6ta mnojeswo zapisi.
Re: store procedure with PostgreSQL
mersi,
do tuk dobre, vru6ta mu jelaniqt resultat, no iskam da sustawq dinami4na SQL zaqwska, ili po to4no dinami4na Where clause, qwno nqkude butkam tuj kato postoqnno mi dawa gre6ka:
CREATE OR REPLACE FUNCTION public.getrows(text)
RETURNS SETOF record AS
'
declare
r record;
begin
for r in select * from categories loop
return next r;
end loop;
return;
end
'
LANGUAGE 'plpgsql' VOLATILE;
kak bi se izmenila tazi funkciq, taka 4e da ima vuzmojnost da se dobawi dinimi4na Where clause
probwah razni varianti no sled kato izvikam funkcioqta mi dawa gre6ka
do tuk dobre, vru6ta mu jelaniqt resultat, no iskam da sustawq dinami4na SQL zaqwska, ili po to4no dinami4na Where clause, qwno nqkude butkam tuj kato postoqnno mi dawa gre6ka:
CREATE OR REPLACE FUNCTION public.getrows(text)
RETURNS SETOF record AS
'
declare
r record;
begin
for r in select * from categories loop
return next r;
end loop;
return;
end
'
LANGUAGE 'plpgsql' VOLATILE;
kak bi se izmenila tazi funkciq, taka 4e da ima vuzmojnost da se dobawi dinimi4na Where clause
probwah razni varianti no sled kato izvikam funkcioqta mi dawa gre6ka
Re: store procedure with PostgreSQL
ами в самата статия има такъв пример (твоя като че ли е от там взиман, но не е взет 100%, ама то и той там е сбъркан ... ;-)))
create or replace function GetRows(text) returns setof record as
'
declare
r record;
begin
for r in EXECUTE ''select * from '' || $1 loop
return next r;
end loop;
return;
end
'
language 'plpgsql';
в случая каквото му зададеш като параметър на функцията ще се залепи директно на заявката, т.е. ти може да си правиш каквато искаш заявка като стринг и после я изпълняваш с EXECUTE
а грешката вероятно която ти дава е защото когато се ползва тип record трябва при викането на процедурата да се напише типа, който се очаква (от примера там)
select * from GetRows(Department) as dept(deptid int, deptname text);
ако искаш да не трябва такъв селект, вместо record трябва да ползваш или готов тип предварително дефиниран като това, което очаква (там пак има примери) или като setof tablename за конкретен вид таблица ето пример
таблицата се казва nummm
create or replace function GetRows() returns setof nummm as
'
declare
r nummm%ROWTYPE;
begin
for r in select * from nummm loop
return next r;
end loop;
return;
end
'
language 'plpgsql';
create or replace function GetRows(text) returns setof record as
'
declare
r record;
begin
for r in EXECUTE ''select * from '' || $1 loop
return next r;
end loop;
return;
end
'
language 'plpgsql';
в случая каквото му зададеш като параметър на функцията ще се залепи директно на заявката, т.е. ти може да си правиш каквато искаш заявка като стринг и после я изпълняваш с EXECUTE
а грешката вероятно която ти дава е защото когато се ползва тип record трябва при викането на процедурата да се напише типа, който се очаква (от примера там)
select * from GetRows(Department) as dept(deptid int, deptname text);
ако искаш да не трябва такъв селект, вместо record трябва да ползваш или готов тип предварително дефиниран като това, което очаква (там пак има примери) или като setof tablename за конкретен вид таблица ето пример
таблицата се казва nummm
create or replace function GetRows() returns setof nummm as
'
declare
r nummm%ROWTYPE;
begin
for r in select * from nummm loop
return next r;
end loop;
return;
end
'
language 'plpgsql';
Re: store procedure with PostgreSQL
mersi
vsi4ko e OK ve4e, to4no kakto mi trqbwashe
eto takiwa diskusii sa polzezni v koito nqma zajdane mejdu u4astnicite, a samo konkretni vuprosi i otgowori
mersi o6te vednuj
vsi4ko e OK ve4e, to4no kakto mi trqbwashe
eto takiwa diskusii sa polzezni v koito nqma zajdane mejdu u4astnicite, a samo konkretni vuprosi i otgowori
mersi o6te vednuj