Antes de assistir a solução do professor em aula eu criei a minha própria, a da aula com certeza é mais simples e provavelmente mais eficiente, mas gostaria de compartilhar a minha de qualquer maneira. O uso found
com certeza facilita muito a vida
create or replace function cria_curso(nome_curso varchar, nome_categoria varchar) returns void as $$
declare
categoria categoria;
contador integer default 1;
limite integer;
retorno varchar;
id_nova_categoria integer;
begin
select count(nome) from categoria into limite;
for categoria in select * from categoria loop
if categoria.nome = nome_categoria then
insert into curso (nome,categoria_id) values (nome_curso, categoria.id);
exit;
elseif contador = limite then
insert into categoria (nome) values (nome_categoria);
select into id_nova_categoria id from categoria where nome = nome_categoria;
insert into curso (nome, categoria_id) values (nome_curso, id_nova_categoria);
end if;
contador := contador + 1;
end loop;
end;
$$ language plpgsql;