Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211

    [PL/SQL] controllo esistenza di un valore

    ciao a tutti, sto facendo una procedura che, in una database con una tabella chiamata parlamentari con campi nome, cognome, legislatura, ecc ecc, deve stampare il numero di legislature in cui un parlamentare passato in input è stato sia deputato che senatore, in caso il parlamentare non fosse presente nella tabella deve sollevare un'eccezione. io ho fatto la mia procedura in questo modo:

    codice:
    create or replace PROCEDURE STAMPALEGISLATURE 
    (
      NOMEP IN VARCHAR2,  
      COGNOMEP IN VARCHAR2  
    ) AS
    CURSOR c1 IS
      SELECT legislatura, count(*)
      FROM repositoryadm.parlamentari
      WHERE ((nome = NOMEP) and (cognome = COGNOMEP) and (tipo = 'd'))
      GROUP BY legislatura;
      
    CURSOR c2 IS
      SELECT legislatura, count(*)
      FROM repositoryadm.parlamentari
      WHERE ((nome = NOMEP) and (cognome = COGNOMEP) and (tipo = 's'))
      GROUP BY legislatura;
      
    deputato c1%rowtype;
    senatore c2%rowtype;
    
    counterdep integer(2) := 0;
    countersen integer(2) := 0;
    
    parlam_not_found EXCEPTION;
    
    BEGIN
      IF((NOMEP NOT IN(SELECT nome FROM repositoryadm.parlamentari)) OR (COGNOMEP NOT IN(SELECT cognome FROM repositoryadm.parlamentari))) THEN 
        RAISE parlam_not_found;
      ELSE
        OPEN c1;
        LOOP
          FETCH c1 INTO deputato; 
          EXIT WHEN c1%notfound;
          counterdep := counterdep + 1;
        END LOOP;
        CLOSE c1;
      
        OPEN c2;
        LOOP
          FETCH c2 INTO senatore;
          EXIT WHEN c2%notfound;
          countersen := countersen + 1;
        END LOOP;
        CLOSE c2;
      
        dbms_output.put_line('il parlamentare ' || NOMEP || ' ' || COGNOMEP || ' è stato deputato per ' || counterdep || ' volte e');
        dbms_output.put_line('senatore per ' || countersen || ' volte.');
      END IF;
      
      EXCEPTION
        WHEN parlam_not_found THEN
          dbms_output.put_line('parlamentare non esistente.');
          ROLLBACK;
    END STAMPALEGISLATURE;
    premetto che se lascio solo il blocco ELSE, mi dà i risultati che richiedo ma fornisce il valore 0 se il parlamentare non è presente nel DB. per far sì che venga sollevata l'eccezione bisogna mettere anche il blocco IF.

    a questo punto l'errore che mi viene visualizzato è il seguente:

    Errore(27,19): PLS-00405: query secondaria non ammessa in questo contesto

    precisamente dove c'è la condizione dell'IF.
    come posso fare a controllare se i valori nomep e cognomep sono presenti nella tabella parlamentari???

  2. #2
    Prova così:

    codice:
    CREATE OR REPLACE PROCEDURE SF_APPPRD.STAMPALEGISLATURE 
    (
      NOMEP IN VARCHAR2,  
      COGNOMEP IN VARCHAR2  
    ) AS
    
    counterall integer(2) := 0;  
    counterdep integer(2) := 0;
    countersen integer(2) := 0;
    
    BEGIN
        select count(*) into counterall from parlamentari
        WHERE ((nome = NOMEP) and (cognome = COGNOMEP));
        
        if counterall>0 then 
        
            Select SUM(DECODE(TIPO,'S',1,0)), SUM(DECODE(TIPO,'D',1,0)) INTO countersen, counterdep from PARLAMENTARI
            Where COGNOME=COGNOMEP AND NOME=NOMEP;
                
            dbms_output.put_line('il parlamentare ' || NOMEP || ' ' || COGNOMEP || ' è stato deputato per ' || counterdep || ' volte e');
            dbms_output.put_line('senatore per ' || countersen || ' volte.');
        else
            dbms_output.put_line('parlamentare non esistente.');
      END IF;
      
      EXCEPTION
        WHEN OTHERS THEN
          RAISE;
          ROLLBACK;
    END STAMPALEGISLATURE;
    /
    Ciao
    Mik

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 © 2025 vBulletin Solutions, Inc. All rights reserved.