Problema con Oracle e variabili

di fermat il
8 risposte
Ciao!

sto cercando di usare le variabili in una query in Oracle:

DECLARE COUNT_RECORD NUMBER;
BEGIN
  SELECT COUNT(*) INTO COUNT_RECORD FROM GEN_ATTRIB_ESTESI GAE 
  INNER JOIN GEN_ANAG GEN ON GAE.NPU = GEN.NPU 
  WHERE 
  GAE.DITAGENDA = 'XXL' 
  AND GEN.NPU = 18126 
  AND GAE.CODICE_ATTR LIKE 'UBICAZ%' 
  AND GEN.DITAGENDA = 'XXL' 
  AND GEN.FVL = ' ' 
  ORDER BY GEN.RAGSOC;
  IF COUNT_RECORD > 0 THEN
    SELECT 
    GEN.NPU NPU,
    GEN.BREVE BREVE,
    GEN.RAGSOC RAGSOC,
    GAE.CODICE_ATTR ATTRIB,
    GAE.VALORE VALORE 
    FROM GEN_ATTRIB_ESTESI GAE 
    INNER JOIN GEN_ANAG GEN ON GAE.NPU = GEN.NPU 
    WHERE 
    GAE.DITAGENDA = 'XXL' 
    AND GEN.NPU = 18126 
    AND GAE.CODICE_ATTR LIKE 'UBICAZ%' 
    AND GEN.DITAGENDA = 'XXL' 
    AND GEN.FVL = ' ' 
    ORDER BY GEN.RAGSOC;
  ELSE
    SELECT 
    GEN.NPU NPU,
    GEN.BREVE BREVE,
    GEN.RAGSOC RAGSOC,
    '' ATTRIB,
    '' VALORE 
    FROM GEN_ANAG GEN 
    WHERE 
    GEN.NPU = 18126 
    AND GEN.DITAGENDA = 'XXL' 
    AND GEN.FVL = ' ' 
    ORDER BY GEN.RAGSOC;
  END IF;
END;
ottengo questo errore che non riesco a risolvere:

Errore con inizio alla riga : 1 nel comando -
.................... (qui c'è scritta tutta la query di nuovo)
Report error -
ORA-06550: riga 13, colonna 5:
PLS-00428: an INTO clause is expected in this SELECT statement
ORA-06550: riga 29, colonna 5:
PLS-00428: an INTO clause is expected in this SELECT statement
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
come dovrei fare??

8 Risposte

  • Allora, ho corretto la query e non mi da errore:
    
    DECLARE 
      COUNT_RECORD NUMBER;
      NPU NUMBER;
      BREVE CHAR(16);
      RAG_SOC VARCHAR2(64);
      CODICE_ATTRIB VARCHAR(12);
      VALORE VARCHAR(100);
      
    BEGIN
      SELECT COUNT(*) INTO COUNT_RECORD FROM GEN_ATTRIB_ESTESI GAE 
      INNER JOIN GEN_ANAG GEN ON GAE.NPU = GEN.NPU 
      WHERE 
      GAE.DITAGENDA = 'XXL' 
      AND GEN.NPU = 18126 
      AND GAE.CODICE_ATTR LIKE 'UBICAZ%' 
      AND GEN.DITAGENDA = 'XXL' 
      AND GEN.FVL = ' ' 
      ORDER BY GEN.RAGSOC;
      IF COUNT_RECORD > 0 THEN
        SELECT 
        GEN.NPU,
        GEN.BREVE,
        GEN.RAGSOC,
        GAE.CODICE_ATTR,
        GAE.VALORE VALORE 
        INTO
        NPU,
        BREVE,
        RAG_SOC,
        CODICE_ATTRIB,
        VALORE
        FROM GEN_ATTRIB_ESTESI GAE 
        INNER JOIN GEN_ANAG GEN ON GAE.NPU = GEN.NPU 
        WHERE 
        GAE.DITAGENDA = 'XXL' 
        AND GEN.NPU = 18126 
        AND GAE.CODICE_ATTR LIKE 'UBICAZ%' 
        AND GEN.DITAGENDA = 'XXL' 
        AND GEN.FVL = ' ' 
        ORDER BY GEN.RAGSOC;
      ELSE
        SELECT 
        GEN.NPU NPU,
        GEN.BREVE BREVE,
        GEN.RAGSOC RAGSOC,
        '' ATTRIB,
        '' VALORE 
        INTO
        NPU,
        BREVE,
        RAG_SOC,
        CODICE_ATTRIB,
        VALORE
        FROM GEN_ANAG GEN 
        WHERE 
        GEN.NPU = 18126 
        AND GEN.DITAGENDA = 'XXL' 
        AND GEN.FVL = ' ' 
        ORDER BY GEN.RAGSOC;
      END IF;
    END;
    
    però non stampa i record a console.
    mi da solo Procedura PL/SQL completata correttamente.
  • E perché mai dovrebbe stampare qualcosa sulla console?

    Dovresti associare le tue query a cursori e, ciclando su questi, usare DBMS_OUTPUT.PUT_LINE per stampare quello che ti serve...
  • dario78 ha scritto:


    E perché mai dovrebbe stampare qualcosa sulla console?

    Dovresti associare le tue query a cursori e, ciclando su questi, usare DBMS_OUTPUT.PUT_LINE per stampare quello che ti serve...
    non so cosi ferrato su oracle!
    adesso provo a vedere i CURSOR.
  • Allora, mi sono guardato un pò di documentazione.
    ho provato questo codice:
    
    DECLARE
      COUNT_RECORD NUMBER;
      NPU NUMBER;
      BREVE CHAR(16);
      RAG_SOC VARCHAR2(64);
      CODICE_ATTRIB VARCHAR(12);
      VALORE VARCHAR(100);
      CURSOR CURSOR_COUNT IS
        SELECT COUNT(*)
        FROM GEN_ATTRIB_ESTESI GAE
        INNER JOIN GEN_ANAG GEN ON GAE.NPU = GEN.NPU
        WHERE
        GAE.DITAGENDA = 'XXL'
        AND GEN.NPU = 18126
        AND GAE.CODICE_ATTR LIKE 'UBICAZ%'
        AND GEN.DITAGENDA = 'XXL'
        AND GEN.FVL = ' '
        ORDER BY GEN.RAGSOC;
     
    BEGIN
      OPEN CURSOR_COUNT;
      COUNT_RECORD := CURSOR_COUNT%ROWCOUNT;
      DBMS_OUTPUT.PUT_LINE(COUNT_RECORD);
      CLOSE CURSOR_COUNT;
    END;
    
    anche in questo caso non vedo output a parte Procedura PL/SQL completata correttamente.
  • Che client oracle stai utilizzando?
    Prima di tutto devi abilitare la "registrazione" delle stringhe che invii al DBMS_OUTPUT con il comando SET SERVEROUTPUT ON
    Dopo di che, se utilizzi sql developer, dal menù Visualizza, devi cliccare la voce OUTPUT DBMS, in modo da mostrare i log che crei a codice. Se usi altri client consulta la documentazione relativa.
  • Ok, con l'istruzione SET SERVEROUTPUT ON funziona.
    però ho un dubbio.
    avrei bisogno di visualizzare l'output dentro ad un client grafico (scritto in Qt).
    devo mettere questo dentro ad una procedure o posso lanciare questo codice direttamente??
    (non so se mi sono spiegato).
  • Credo di aver capito il senso della tua domanda.
    In questi casi dovresti creare una Function o una Procedure ed interfacciarti ad essa con le librerie a tua disposizione (in java useresti jdbc, nel tuo caso non so...).

    Il DBMS_OUTPUT andrebbe utilizzato solo in fase di sviluppo per scopi di logging, nulla più.
  • dario78 ha scritto:


    Credo di aver capito il senso della tua domanda.
    In questi casi dovresti creare una Function o una Procedure ed interfacciarti ad essa con le librerie a tua disposizione (in java useresti jdbc, nel tuo caso non so...).

    Il DBMS_OUTPUT andrebbe utilizzato solo in fase di sviluppo per scopi di logging, nulla più.
    ok perfetto.
    allora farò una procedure.
    scusate se la domanda non era chiara.

    grazie!!
Devi accedere o registrarti per scrivere nel forum
8 risposte