Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    ORACLE: funzione che non funzia

    Ciao a tutti,

    avrei bisogno di un aiuto su come creare ad hoc una function in oracle...vi spiego:

    questa funzione accetta come parametri

    1 - dalla data
    2 - alla data
    3 - codice articolo
    4 - magazzino

    CREATE OR REPLACE FUNCTION "EXPLORER"."QTA_MAG"( DTIN IN CHAR, DTFI IN CHAR, REFE IN CHAR, MAG IN varchar2)
    RETURN NUMBER
    IS TQTA NUMBER(11,2);
    BEGIN
    SELECT
    SUM(C_ENTRATO_QTA)
    INTO TQTA
    FROM
    ST_COMM_GIORN
    WHERE
    C_DATA BETWEEN QTA_MAG.DTIN AND QTA_MAG.DTFI AND
    C_FLG_FLUSSO='MOV' AND
    C_REFERENZA=QTA_MAG.REFE AND
    C_CDC_MAG IN (QTA_MAG.MAG);
    RETURN(TQTA);
    END;

    quindi:

    SELECT QTA_MAG('2009-02-01','2009-02-28','102300','20') AS TQTA FROM DUAL

    TQTA
    -------
    506

    ...ma se volessi il totale passando più di un magazzino, una cosa tipo:

    MAG = '20','22','24'....etc

    come devo strutturare la function ? ...perchè se gli passo il parametro così, oracle lo interpreta come valore da passare alla IN e non come stringa per comporla...

    non ho molta dimestichezza...penso si deduca.

    potete aiutarmi ?

    Grazie e ciao

    Andrea

  2. #2
    Un modo poco raffinato, ma comunque funzionale, potrebbe essere il seguente:

    gli passi come parametro MAG l'elenco di valori separati da virgole (anche all'inizio e alla fine), del tipo ',A,B,C,'

    e rivedi la tua select come segue:

    SELECT
    SUM(C_ENTRATO_QTA)
    INTO TQTA
    FROM
    ST_COMM_GIORN
    WHERE
    C_DATA BETWEEN QTA_MAG.DTIN AND QTA_MAG.DTFI AND
    C_FLG_FLUSSO='MOV' AND
    C_REFERENZA=QTA_MAG.REFE AND

    instr (','||MAG||',', C_CDC_MAG)> 0

    RETURN(TQTA);

    La funzione instr restituisce la posizione della seconda stringa all'interno della prima. Se la stringa è presente, la funziona ritorna quindi un valore > 0. Le virgole all'inizio e alla fine servono a limitare i valori all'interno della stringa. Se il tuo parametro MAG può contenere delle virgole, usa un delimitatore differente.

    Va detto che creare una function che si limita a fare una select... di solito non ha molto senso. Tanto vale fare direttamente la select,e recuperarne il valore

  3. #3
    Ciao,
    intanto grazie per la risposta, avevo pensato anche io a una cosa del genere:

    INSTR(QTA_MAG.MAG,C_CDC_MAG,1,1)>0;

    ...posso passarla direttamente così, visto che il campo C_CDC_MAG è composto in ogni caso da due caratteri e non conterrà mai virgole punti etc etc...

    riguardo al senso della cosa...questa function verrà richiamata all'interno di un'altra query, che estrae dei dati aventi un range di date diverso rispetto la func...spiegarti il perchè di questo diventerebbe probabilmente lungo e noisoso ...mi sembrava semplicemente la soluzione migliore

    Grazie ancora

    Andrea

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.