Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #93549
    gsmdf
    Participante

      Estou 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!

      #93551
      fsitja
      Participante

        Nã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.

        #93559
        gsmdf
        Participante

          Não entendi apenas o select from DUAL… que que seria essa tabela DUAL?

          #93564
          burga
          Participante

            A 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…

            #93565
            gsmdf
            Participante

              Burga, sem o FROM tabela dá erro de sintaxe..
              Entendi!

              #93567
              fsitja
              Participante

                Antes do 10g realmente eu não usaria a Dual, mas depois criaram o acesso Fast Dual, então não machuca mais.

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.