1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Ajuda com função PL/SQL

Discussão em 'Programação' iniciada por Abelha Maia, 16 de Setembro de 2008. (Respostas: 2; Visualizações: 1818)

  1. Olá a todos! Venho pedir a vossa ajuda por favor.
    Tenho conhecimentos de SQL mas no PL/SQL sou nova e o que se passa é o seguinte:


    Tenho esta função

    Código:
    CREATE OR REPLACE
      FUNCTION CRITICO_2
        (
          "BP"    IN NUMBER,
          "TEMP"  IN NUMBER,
          "DATA1" IN DATE,
          "DATA2" IN DATE)
        RETURN NUMBER
      IS
        DATAI DATE;
        DATAF DATE;
        ResultF NUMBER;
      BEGIN
        IF BP    >19 THEN
          DATAI := DATA1;
        END IF;
        WHILE BP>19
        LOOP
           INSERT INTO valores_carlos_2
            (date2
            ) VALUES
            (to_date('#'||DATAI,'dd-mm-yyyy HH24:MI:SS')
            );
        END LOOP;
        DATAF   := DATA1;
        DATAI   := DATA2;
        ResultF :=
        (
          TRUNC(86400*(DATAF-DATAI))- 60*(TRUNC((86400*(DATAF-DATAI))/60))+ ((TRUNC((86400*(DATAF-DATAI))/60)- 60*(TRUNC(((86400*(DATAF-DATAI))/60)/60)))*60) + ((TRUNC(((86400*(DATAF-DATAI))/60)/60)- 24*(TRUNC((((86400*(DATAF-DATAI))/60)/60)/24)))*24*60) + ((TRUNC((((86400*(DATAF-DATAI))/60)/60)/24))*24*60*60)
        )
        ;
        IF ResultF > 1 THEN
          ResultF := 1;
        ELSE
          ResultF := 0;
        END IF;
        RETURN ResultF;
      END CRITICO_2;
    que ao compilar dá o seguinte:

    Código:
    Warning(22,10): PLW-07202: o tipo de associação resultaria numa conversão não correspondente ao tipo de coluna.
    Warning(22,23): PLW-07202: o tipo de associação resultaria numa conversão não correspondente ao tipo de coluna.
    Warning(22,29): PLW-07202: o tipo de associação resultaria numa conversão não correspondente ao tipo de coluna.
    Não faço ideia do que isto quer dizer, já andei à procura no google, mas cada vez percebo menos :confused:


    Mesmo com erros, tentei correr a função para ver que erros dava

    Código:
    select critico_2(bp, temp, date1, date2)
    from valores_carlos;
    e aparece isto
    Código:
    SQL Error: ORA-14551: cannot perform a DML operation inside a query 
    ORA-06512: at "UMHGSA.CRITICO_2", line 18
    14551. 00000 -  "cannot perform a DML operation inside a query "
    *Cause:    DML operation like insert, update, delete or select-for-update
               cannot be performed inside a query or under a PDML slave.
    *Action:   Ensure that the offending DML operation is not performed or
               use an autonomous transaction to perform the DML operation within
               the query or PDML slave.
    :confused:

    Desculpem o testamento, mas se me puderem dar umas luzes, agradecia! Não fui eu que desenvolvi a função, mas estou a tentar resolver estes erros :wow:
     
    Última edição: 17 de Setembro de 2008
  2. Karski

    Karski Power Member

    1- No teu insert estás a fazer um to_date de um campo que já é data. Além do mais o que raio estás a tentar fazer ao tentar concatenar um '#' com data?

    2 - Não podes fazer um insert pela chamada a essa função apartir de um select a uma tabela.

    PAra resolveres o teu problema cria por exemplo um cursor e depois para cada linha do cursor faz uma chamada à tua função e fazes um output do resultado.

    Já agora só para finalizar mas com o teu código se eventualmente a variável BP for mesmo maior que 19 não sais mais do loop :)
     
  3. Como eu disse, não fui eu que desenvolvi a função.
    Obrigada pelas tuas dicas!
     

Partilhar esta Página