Возврат значения

• Для заданных значений имени и адреса человека возвратить значение 1, если тот является актером, но не руководящим лицом, 2 – если человек является руководителем, но не относится к числу актеров, 3 - если человека с указанным и адресом нет ни в когорте актеров, ни в обойме руководителей.

create or replace function z3(character)
returns character as
$$
declare tmp_id_act int;
begin
select id,actor,head from people where lname=$1 into tmp_id_act;
if(tmp_id_act is null) then return 'Нет такого актера в базе';end if;
if people.actor=true and people.head=false then return 1;end if;
if people.actor=false and people.head=true then return '2';end if;
if people.actor=false and people.head=false then return '3';end if;
end;
$$
language 'plpgsql' volatile

Подскажите, пожалуйста, что я делаю не так? Выдает ошибку что таблица "people" отсутствует в предложении FROM...

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Так для начала-то, таблицу

Так для начала-то, таблицу people создали?

Конечно. CREATE TABLE

Конечно.
CREATE TABLE people
(
id serial NOT NULL,
lname character(15),
fname character(15),
mname character(20),
birthday date,
sex character(1),
id_city integer,
address character(20),
revenue integer,
income integer,
actor boolean,
head boolean,
CONSTRAINT id_man PRIMARY KEY (id),
CONSTRAINT idcity FOREIGN KEY (id_city)
REFERENCES cities (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

попробовала так:
create or replace function z3(character) returns integer as
$$
declare aaa integer;
begin
select actor,head from people where lname=$1;
if people.actor=true and people.head=false then aaa:=1;
elsif people.actor=false and people.head=true then aaa:=2;
elsif people.actor=false and people.head=false then aaa:=3;end if;
return aaa;
end;
$$
language 'plpgsql' volatile

выдает, что нет назначения для данных результата

Ну, так и не должно

Ну, так и не должно завестись. Результат пишешь в tmp_id_act, а значения потом берёшь из people и, естественно, такой переменной у тебя нет.
И я бы сделал иначе (работать должно быстрее, написал без проверки):

CREATE OR REPLACE FUNCTION public.z4(character) returns integer AS
$$
begin
RETURN QUERY
SELECT 
    CASE WHEN actor=true AND head=false THEN 1
    WHEN actor=false AND head=true THEN 2
    ELSE 3 END 
FROM people 
WHERE lname=$1;
end;
$$
LANGUAGE sql

RETURN QUERY возвращает

RETURN QUERY возвращает множество, а мне надо одно значение. но можно же возвратить таблицу, так работает:

CREATE OR REPLACE FUNCTION z4(character) returns table (res integer) AS
$$
begin
RETURN QUERY
SELECT
CASE WHEN actor=true AND head=false THEN 1
WHEN actor=false AND head=true THEN 2
ELSE 3 END
FROM people
WHERE lname=$1;
end;
$$
LANGUAGE plpgsql

Попробуй так: declare

Попробуй так:

declare
tmp_id_act record;
begin
select id,actor,head from people where lname=$1 into tmp_id_act;

if(tmp_id_act is null) then return 'Нет такого актера в базе';end if;
if tmp_id_act.actor=true and tmp_id_act.head=false then return 1;end if;
if tmp_id_act.actor=false and tmp_id_act.head=true then return '2';end if;
if tmp_id_act.actor=false and tmp_id_act.head=false then return '3';end if;
end;

Да, так работает! Спасибо!))

Да, так работает! Спасибо!))

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023