Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ! / 10 сообщений из 10, страница 1 из 1
06.08.2003, 14:06
    #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
06.08.2003, 15:35
    #32228953
Konrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
Что-то я не понял...
Что за помесь Postgres'a с PHP?
...
Рейтинг: 0 / 0
06.08.2003, 15:59
    #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
06.08.2003, 16:00
    #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
Период между сообщениями больше года.
05.04.2006, 18:56
    #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
05.04.2006, 19:22
    #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
05.04.2006, 20:47
    #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
06.04.2006, 10:16
    #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
06.04.2006, 10:24
    #33648126
Funny_Falcon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
J-ProНарод, я юзал до этого MS SQL 2000. Такая приятная штука по сравнению с PostgreSQL....
Не хочу наводить флейм, но лично я радуюсь, что перешел на PostgreSQL - по понятней будет.
...
Рейтинг: 0 / 0
06.04.2006, 11:02
    #33648277
J-Pro
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
НЕ ОТРАБАТЫВАЕТ ФУНКЦИЯ!
Funny_Falcon J-ProНарод, я юзал до этого MS SQL 2000. Такая приятная штука по сравнению с PostgreSQL....
Не хочу наводить флейм, но лично я радуюсь, что перешел на PostgreSQL - по понятней будет.

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


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