powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
10 сообщений из 10, страница 1 из 1
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #32228755
Tanya--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!

Может кто помочь со следующим. В БД создана функция:

CREATE FUNCTION public.ins1(int4, int4) RETURNS int4 AS '
BEGIN
select * from dblink_connect(''hostaddr=ххх.ххх.ххх.ххх port=5432 dbname=test user=postgres password=postgres'');
select * from dblink_exec(''insert into test_main values (%1,%2,1)'');
Return 0;
END;' LANGUAGE 'plpgsql' VOLATILE;

команды, находящиеся в теле функции срабатываюе на "ура" пока их не запихали в функцию.
В результате при попытке выполнить select ins1(2,2)
вылезает ошибка: SELECT query has no destination for result data.
If you want to discard the results, use PERFORM instead.

ПОМОГИТЕ ПОЖАЛУЙСТА!
что нужно сделать?

Спасибо заранее...
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #32228953
Konrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то я не понял...
Что за помесь Postgres'a с PHP?
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #32229007
Tanya--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вопрос решился.
срабатывающтй вариант функции:
CREATE FUNCTION public.ins1(int4, int4) RETURNS int4 AS '
BEGIN
PERFORM dblink_connect(''hostaddr=ххх.ххх.ххх.ххх port=5432 dbname=test user=postgres password=postgres'');
PERFORM dblink_exec(''insert into test_main values (''||$1||'',''||$2||'',1)'');
Return 0;
END;' LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #32229010
Stellar.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE OR REPLACE FUNCTION .................. AS '
DECLARE
   rRecord     RECORD;
BEGIN
SELECT a, b, c INTO rRecord FROM xyz WHERE a = '1';

....
....
END;
'
LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #33647361
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, я юзал до этого MS SQL 2000. Такая приятная штука по сравнению с PostgreSQL.... Но... последний бесплатный, поэтому, разбираемся...

Вопрос - сабж. Посмотрел ваши ответы, пробовал и PERFORM, и INTO rec, где rec - это RECORD. Функция отрабатывает, но результатов нет, кроме названий столбцов.

Объясню ситуацию: есть две таблицы: Projects и Customers:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CREATE TABLE "public"."Projects" (
  "ProjectID" INTEGER DEFAULT nextval(('"public"."projects_projectid_seq"'::text)::regclass) NOT NULL, 
  "Name" VARCHAR( 50 ), 
  "Description" VARCHAR( 255 ), 
  "CustomerID" INTEGER, 
  "StartDate" DATE DEFAULT ('now'::text)::date, 
  "Identifier" VARCHAR( 50 ), 
  "Custom1" VARCHAR( 50 ), 
  "Custom2" VARCHAR( 50 ), 
  "Custom3" VARCHAR( 50 ), 
  "Custom4" VARCHAR( 50 ), 
  CONSTRAINT "Projects_pkey" PRIMARY KEY("ProjectID"), 
  CONSTRAINT "Projects_fk" FOREIGN KEY ("CustomerID")
    REFERENCES "public"."Customers"("CustomerID")
    MATCH FULL
    ON DELETE RESTRICT
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) WITHOUT OIDS;

CREATE TABLE "public"."Customers" (
  "CustomerID" INTEGER DEFAULT nextval(('"public"."customers_customerid_seq"'::text)::regclass) NOT NULL, 
  "CompanyName" VARCHAR( 50 ) NOT NULL, 
  "ContactFirstName" VARCHAR( 50 ), 
  "ContactLastName" VARCHAR( 50 ), 
  "BillingAddress" VARCHAR( 50 ), 
  "City" VARCHAR( 50 ), 
  "StateOrProvince" VARCHAR( 50 ), 
  "PostalCode" VARCHAR( 50 ), 
  "Country" VARCHAR( 50 ), 
  "ContactTitle" VARCHAR( 50 ), 
  "PhoneNumber" VARCHAR( 50 ), 
  "FaxNumber" VARCHAR( 50 ), 
  "EmailAddress" VARCHAR( 50 ), 
  "Notes" VARCHAR( 255 ), 
  CONSTRAINT "Customers_pkey" PRIMARY KEY("CustomerID")
) WITHOUT OIDS;

Я их заполнил данными так, чтобы в проектах были записи о кастомерах. Создал ещё одну таблицу, как тип для ф-ции, которая будет возвращать инфу и проекте и сразу же всю инфу о его кастомере:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE TABLE "public"."ReturnFullProjects" (
  "ProjectID" INTEGER, 
  "ProjectName" VARCHAR( 50 ), 
  "ProjectDescription" VARCHAR( 255 ), 
  "ProjectCustomerID" INTEGER, 
  "ProjectStartDate" DATE, 
  "ProjectIdentifier" VARCHAR( 50 ), 
  "ProjectCustom1" VARCHAR( 50 ), 
  "ProjectCustom2" VARCHAR( 50 ), 
  "ProjectCustom3" VARCHAR( 50 ), 
  "ProjectCustom4" VARCHAR( 50 ), 
  "CustomerID" INTEGER, 
  "CustomerCompanyName" VARCHAR( 50 ), 
  "CustomerContactFirstName" VARCHAR( 50 ), 
  "CustomerContactLastName" VARCHAR( 50 ), 
  "CustomerBillingAddress" VARCHAR( 50 ), 
  "CustomerCity" VARCHAR( 50 ), 
  "CustomerStateOrProvince" VARCHAR( 50 ), 
  "CustomerPostalCode" VARCHAR( 50 ), 
  "CustomerCountry" VARCHAR( 50 ), 
  "CustomerContactTitle" VARCHAR( 50 ), 
  "CustomerPhoneNumber" VARCHAR( 50 ), 
  "CustomerFaxNumber" VARCHAR( 50 ), 
  "CustomerEmailAddress" VARCHAR( 50 ), 
  "CustomerNotes" VARCHAR( 255 )
) WITHOUT OIDS;

Затем, создаю функцию выборки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION "public"."GetAllProjects" () RETURNS SETOF "public"."ReturnFullProjects" AS
$body$
DECLARE rec RECORD;

BEGIN

SELECT * INTO rec FROM "Projects" P
JOIN "Customers" C ON P."CustomerID" = C."CustomerID";

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

И когда в простом SQL редакторе пишу запрос типа: select * FROM "GetAllProjects"(), получаю лишь названия столбцов таблицы ReturnFullProjects. А надо и записи, блин...

Когда же выбираю просто все проекты функцией, написанной на простом языке sql:

Код: plaintext
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION "public"."getPrj1" () RETURNS SETOF "public"."Projects" AS
$body$
SELECT * INTO rec FROM "Projects" P;
$body$
LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

то всё выбирается, но правда только в два столбика: row и getPrj1(). В row просто порядковый номер записи, а в getPrj1() в скобках через запятую перечислены данные полей таблицы Projects.


Что посоветуете использовать? Как быть? Желательно бы использовать тот же plpgsql для отображения записей, вдруг понадобится вставлять туда условия IF или обьявлять переменные, которых простой sql не понимает... Как отобразить данные? Далее я буду получать эти данные recordset'ом через JDBC драйвер. Но надо, чтобы они отображались... помогите плиз.

Заранее благодарен!

P.S.: То ли дело MS SQL Server 2000... как там легко это дело делать... без всяких лишних типов для возврата, без всяких преформов и т.д... эххх :((


Ещё раз ОГРОМНОЕ спасибо за любой дельный совет!
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #33647409
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как мне нравится этот закон! ;) Я о законе подлости :) Иногда он реально помогает. Только что написал в форум о своей проблеме, но не оставил поисков её решения. И вот, дошёл до рабочего варианта. Если кто-то знает что-то лучше, прошу, выложете здесь... Или какие-то ошибки у меня в определениях, которые видны Вам, пожалуйста, напишите тут об этом. Спасибо.

Пишу тут решение, может, кому-то поможет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION "public"."GetAllProjects" () RETURNS SETOF "public"."ReturnFullProjects" AS
$body$
DECLARE rec RECORD;

BEGIN

FOR rec IN SELECT * FROM "Projects" P
JOIN "Customers" C ON P."CustomerID" = C."CustomerID"

LOOP
RETURN NEXT rec;
END LOOP;
RETURN;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #33647524
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J-ProКак мне нравится этот закон! ;) Я о законе подлости :) Иногда он реально помогает. Только что написал в форум о своей проблеме, но не оставил поисков её решения. И вот, дошёл до рабочего варианта. Если кто-то знает что-то лучше, прошу, выложете здесь... Или какие-то ошибки у меня в определениях, которые видны Вам, пожалуйста, напишите тут об этом. Спасибо.

Пишу тут решение, может, кому-то поможет:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE OR REPLACE FUNCTION "public"."GetAllProjects" () RETURNS SETOF "public"."ReturnFullProjects" AS
$body$
DECLARE rec RECORD;

BEGIN

FOR rec IN SELECT * FROM "Projects" P
JOIN "Customers" C ON P."CustomerID" = C."CustomerID"

LOOP
RETURN NEXT rec;
END LOOP;
RETURN;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


а что, разве
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION "public"."GetAllProjects" () RETURNS SETOF "public"."ReturnFullProjects" AS
'
SELECT "ProjectID",  "Name", "Description", "CustomerID", "StartDate", "Identifier",
           "Custom1", "Custom2", "Custom3", "Custom4", "CustomerID", "CompanyName", 
           "ContactFirstName", "ContactLastName", "BillingAddress", "City", 
           "StateOrProvince", "PostalCode", "Country", "ContactTitle", "PhoneNumber", 
           "FaxNumber", "EmailAddress", "Notes"
  FROM "Projects" P
   JOIN "Customers" C
     ON P."CustomerID" = C."CustomerID"
'
LANGUAGE 'sql';
не работает
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #33648103
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ZemAа что, разве
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION "public"."GetAllProjects" () RETURNS SETOF "public"."ReturnFullProjects" AS
'
SELECT "ProjectID",  "Name", "Description", "CustomerID", "StartDate", "Identifier",
           "Custom1", "Custom2", "Custom3", "Custom4", "CustomerID", "CompanyName", 
           "ContactFirstName", "ContactLastName", "BillingAddress", "City", 
           "StateOrProvince", "PostalCode", "Country", "ContactTitle", "PhoneNumber", 
           "FaxNumber", "EmailAddress", "Notes"
  FROM "Projects" P
   JOIN "Customers" C
     ON P."CustomerID" = C."CustomerID"
'
LANGUAGE 'sql';
не работает?

Я же пишу, что на простом sql работает. А если тебе в этой функции надо будет проверить аргументы, используя IF? Или объявить дополнительные переменные? Это только в plpgsql можно. А твоя ф-ция, так, как ты её написал выше, в языке plpgsql работать не будет.

Кстати, если не писать "VOLATILE CALLED ON NULL INPUT SECURITY INVOKER", это, ведь, по умолчанию, да?
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #33648126
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J-ProНарод, я юзал до этого MS SQL 2000. Такая приятная штука по сравнению с PostgreSQL....
Не хочу наводить флейм, но лично я радуюсь, что перешел на PostgreSQL - по понятней будет.
...
Рейтинг: 0 / 0
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
    #33648277
J-Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_Falcon J-ProНарод, я юзал до этого MS SQL 2000. Такая приятная штука по сравнению с PostgreSQL....
Не хочу наводить флейм, но лично я радуюсь, что перешел на PostgreSQL - по понятней будет.

На этот счёт, думаю, у каждого своё мнение и для этого действительно нужна (или уже есть) отдельная тема. Своим высказываниемм я лишь хотел показать, что лично мне именно разбираться с этой базой гораздо сложнее, вот и всё. Поэтому, попросил помощи. И всё ещё жду от вас ответов, если я что-то неверно\нерационально выше написал. Спасибо заранее.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]