• Для заданных значений имени и адреса человека возвратить значение 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 и, естественно, такой переменной у тебя нет.
И я бы сделал иначе (работать должно быстрее, написал без проверки):
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;
Да, так работает! Спасибо!))
Да, так работает! Спасибо!))