Olá pessoal,
estou com u pequeno problema para concluir uma verificação de minha aplicação. acontece que estou tentando fazer a nivel de banco de dados. o banco utilizado é o oracle 10g, segue dulvida:
tenho o seguinte código
FUNCTION FC_ALTERNA_INSERIR_EDITAR
( v_zona number, v_tipo varchar, v_periodo number )
RETURN varchar
IS
pragma autonomous_transaction;
v_tabela_tipo varchar2(50);
v_retorno varchar2(3);
v_texto varchar2(3);
BEGIN
begin
-- seta os valores de data para validar a inserção ou edição do mes/ano do usuário:
if v_tipo = 'adm' then v_tabela_tipo := 'admzona.new_processos_administrativos';
elsif v_tipo = 'jus' then v_tabela_tipo := 'admzona.new_processos_judiciais';
elsif v_tipo = 'exp' then v_tabela_tipo := 'admzona.new_processos_expedientes';
end if;
-- fim
select decode(a.seq,null,'NAO','SIM') into v_texto
from v_tabela_tipo a
where a.seq = v_zona
and a.mes||a.ano = v_periodo;
v_retorno := v_texto;
return v_retorno;
end;
RETURN v_retorno ;
END;
reparem que existe a variáevel “v_tabela_tipo” onde digo qual tabela será pesquisada dependendo do parametro passado para função.
pergunta existe um geito de inserir esta variável dentro desta instrução ? pois o erro esta ai.
outra informação:
o comando “execut immediate” não funciona, pois preciso setar um valor vindo deste select e quando fica entre aspas simples não rola, também ACHO que o execute immediate não rola com select apenas com isert, update e delete.
o que viocê me dizem???
Veja o exemplo 7.9 nesse link:
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/dynamic.htm
Execute Immediate faz de tudo, não só insert, delete ou update… Atente nesse exemplo que indiquei o uso das aspas simples na string que está sendo preparada pra executar.
Mas na boa, nesse teu código, eu só usaria execute immediate se não pudesse prever em qual tabela seria dado o select. Com apenas essas três possibilidades eu daria um select a cada if…
E outra… se naquele decode você está esperando tratar a possibilidade de não retornar registro do select, me parece que vai furar. Porque select sem retorno no Oracle não volta null, é um registro vazio, o que é diferente. Se é isso que você quer capturar, precisa cercar o select com um begin… end capturando a exception WHEN NO_DATA_FOUND…
ADEMILTON,
Muito obrigado pelas dicas. resolvi aqui o problema desta forma:
FUNCTION FC_ALTERNA_INSERIR_EDITAR
( v_zona number, v_tipo varchar, v_periodo varchar )
RETURN varchar
IS
pragma autonomous_transaction;
v_tabela_tipo varchar2(50);
v_retorno varchar2(3);
v_texto varchar2(3);
BEGIN
begin
-- seta os valores de data para validar a inserção e edição do mes/ano do usuário:
if v_tipo = 'adm' then v_tabela_tipo := 'admzona.new_processos_administrativos';
elsif v_tipo = 'jus' then v_tabela_tipo := 'admzona.new_processos_judiciais';
elsif v_tipo = 'exp' then v_tabela_tipo := 'admzona.new_processos_expedientes';
end if;
-- fim
execute immediate
'select decode(a.seq,null,''NAO'',''SIM'')
from '||v_tabela_tipo||' a
where a.seq = '||v_zona||'
and a.mes||a.ano = '||v_periodo into v_texto;
v_retorno := v_texto;
return v_retorno;
end;
exception
WHEN OTHERS THEN
v_retorno := 'NAO';
return v_retorno;
RETURN v_retorno ;
END;
deu certo!
no caso do retorno do campo seq, ele poderá sim retornar null pois a linha existe mas em alguns casos com esse campo null.
no final mandei uma execption para others em caso de merda das brabas.
no mais valeu,
abraço,