2016-12-22 1 views
1

Я новичок в postgres и программировании, и я уже искал решение для этого, но я не смог его получить. Я пытаюсь сделать функцию, которая будет возвращать информацию обо всех клиентах в этой конкретной стране всякий раз, когда я звоню в страну. Это ошибка, которая появляется. Мне очень жаль просить об этом, но я застрял здесь со вчерашнего дня.POSTGRESQL-Query не имеет адресата для данных результата

ERROR: query has no destination for result data
HINT: If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT: PL/pgSQL function country(text) line 5 at SQL statement

Вот функция:

create or replace function country(text) returns text as $$ 
begin 


    select customer_id, customer.first_name, customer.last_name 

    from customer 

    inner join address on customer.address_id = address.address_id 
    inner join city on address.city_id = city.city_id 
    inner join country on city.country_id = country.country_id 

    where country = '$1'; 
    end; 
    $$ 

    language plpgsql; 
+1

Вы запрашиваете, но не возвращаете ничего из proc. Как насчет использования 'language sql', как показано в примерах здесь: https://www.postgresql.org/docs/9.2/static/xfunc-sql.html – Glenn

+0

Я изменил его на sql, и это вызывает ошибку ERROR: синтаксис при или рядом «выберите» ЛИНИЯ 5: выберите customer_id, customer.first_name, customer.last_name ^ im действительно запутано – kimdasuncion12

+0

Посмотрите внимательно на примеры. В 35.4.4 приведены примеры, соответствующие вашему сценарию. Сначала вы можете попробовать запустить их, а затем перейти к тому, что хотите. Обратите внимание, что версия 'language sql' в примере не имеет' begin' или 'end' и имеет параметры' out'. – Glenn

ответ

5

Если вы выполняете инструкцию select в функции PL/pgSQL, вы должны поместить результат запроса в некоторую переменную (ы) (= место назначения). Затем вы работаете с переменной (-ами) в функции. Вы также должны иметь заявление RETURN.

Обратите внимание, что вышеизложенное работает только в том случае, если запрос возвращает одну строку. Если запрос возвращает несколько строк, в функции можно использовать use a loop. Даже проще, вы можете просто вернуть результаты из запроса, как так:

create or replace function country(text) 
returns table (id integer, first_name varchar, last_name varchar) as $$ 
begin 
    return query 
    select customer_id, customer.first_name, customer.last_name 
    from customer 
    inner join address on customer.address_id = address.address_id 
    inner join city on address.city_id = city.city_id 
    inner join country on city.country_id = country.country_id 
    where country = $1; 
end; 
$$ language plpgsql; 

Но как Evan Carroll сказал, если не нужна функция PL/PgSQL, чтобы изменить данные, прежде чем вернуться, вы лучше с простой Посмотреть.

+0

Спасибо за подробный ответ Патрик! – kimdasuncion12

0

Пожалуйста, используйте ниже, чтобы получить результат данной функции ..

create or replace function country(in_parameter text,out out_res refcursor) as $$ 
begin 
open out_res for 
select customer_id, customer.first_name, customer.last_name 

from customer 

inner join address on customer.address_id = address.address_id 
inner join city on address.city_id = city.city_id 
inner join country on city.country_id = country.country_id 

where country = '$1'; 
end; 
$$ 

language plpgsql; 
+0

привет Riya я попробовал, и он вернул этот результат, можете ли вы мне помочь? – kimdasuncion12

+0

страна -------------------- <неназванный портал 1> – kimdasuncion12

0

Это не нормально для SQL. Обычно это будет VIEW.

CREATE VIEW myView AS 
    SELECT customer_id, customer.first_name, customer.last_name 
    FROM customer 
    INNER JOIN address USING (address_id) 
    INNER JOIN city USING (city_id) 
    INNER JOIN country USING (country_id); 

Тогда вы

SELECT * FROM myView WHERE country = ? 

Все, что сказал, если вы настаиваете на том, эту функцию, и вы не должны, вы должны сделать его LANAGUAGE SQL и не LANGUAGE plppsql.

0

Он работал для моего коллеги, когда она использовала ОТКРЫТЫЕ MYCURS перед запросом на выборку и RETURN MYCURS после выбора запроса.