- Este tópico contém 5 respostas, 3 vozes e foi atualizado pela última vez 15 anos, 11 meses atrás por
fsitja.
-
AutorPosts
-
6 de abril de 2010 às 5:35 pm #93549
gsmdf
ParticipanteEstou fazendo uma trigger e ao tentar implementar a seguinte estrutura dá erro, fica vermelho no “UNION” e fala “PLS-00405: subquery not allowed in this context”.
Qual seria a sintaxe correta?
Conceitualmente o trecho seguinte é “Se o novo cod_unidade for de ministro ou membro_ministerio_publico então aborte a operação”.IF (:new.cod_unidade_tcu IN
(SELECT cod_gabinete FROM ministro
UNION
SELECT cod_gabinete FROM membro_ministerio_publico))
THEN
RAISE erro;
END IF;Vlw!
6 de abril de 2010 às 6:41 pm #93551fsitja
ParticipanteNão pode usar query no IN dentro de PL/SQL.
DECLARE
v_achou_cod VARCHAR2(10);
BEGIN
BEGIN
SELECT 'ACHEI'
INTO v_achou_cod
FROM dual
WHERE EXISTS (SELECT 1
FROM (SELECT cod_gabinete
FROM ministro
UNION
SELECT cod_gabinete FROM membro_ministerio_publico)
WHERE cod_gabinete = :new.cod_unidade_tcu);
EXCEPTION
WHEN no_data_found THEN
v_achou_cod := 'NÃO ACHEI';
END;
dbms_output.put_line(v_achou_cod);
IF v_achou_cod = 'ACHEI' THEN
RAISE erro;
END IF;
END;
Obs: não consegui postar pois dá erro no forum. Nesse caso não vale a pena usar “union” pois ele demanda recursos do banco de dados para fazer um sort e “distinct” implícitos nos dados.
Troque ele para um UNI0N ALL.
7 de abril de 2010 às 6:03 pm #93559gsmdf
ParticipanteNão entendi apenas o select from DUAL… que que seria essa tabela DUAL?
7 de abril de 2010 às 7:36 pm #93564burga
ParticipanteA dual é uma tabela “dummy”, serve pra você fazer operações com o select onde não são necessárias extrações de dados do banco.
Mas acho que nesse caso nem precisa utilizar esta tabela DUAL, poderia ser direto:
DECLARE
v_achou_cod VARCHAR2(10);
BEGIN
BEGIN
SELECT 'ACHEI'
INTO v_achou_cod
FROM (SELECT cod_gabinete
FROM ministro
UNION ALL
SELECT cod_gabinete
FROM membro_ministerio_publico)
WHERE cod_gabinete = :new.cod_unidade_tcu
AND rownum < 2;
EXCEPTION
WHEN no_data_found THEN
v_achou_cod := 'NÃO ACHEI';
END;
dbms_output.put_line(v_achou_cod);
IF v_achou_cod = 'ACHEI' THEN
RAISE erro;
END IF;
END;Aí Fsitja, postar a string “UNION ALL” só funciona quando você não coloca espaços antes dele. Não sei porque…
7 de abril de 2010 às 8:29 pm #93565gsmdf
ParticipanteBurga, sem o FROM tabela dá erro de sintaxe..
Entendi!7 de abril de 2010 às 11:16 pm #93567fsitja
ParticipanteAntes do 10g realmente eu não usaria a Dual, mas depois criaram o acesso Fast Dual, então não machuca mais.
-
AutorPosts
- Você deve fazer login para responder a este tópico.