CONTE in PLSQL ORACLE

Ho fatto questa domanda prima, ma non mi sono di alcun aiuto.
Voglio ottenere il numero di righe in due differenti tabella dato un attributo.
Questo è il mio codice .
Invece di andare a prendere il conteggio totale, in cui la condizione tiene, sono sempre l’intero conteggio della tabella

    create or replace PROCEDURE p1( suburb IN varchar2 ) 
    as
        person_count NUMBER;
        property_count NUMBER;
    BEGIN
        SELECT count(*) INTO person_count
        FROM person p WHERE p.suburb = suburb ;

        SELECT count(*) INTO property_count
        FROM property pp WHERE pp.suburb = suburb ;


        dbms_output.put_line('Number of People :'|| person_count);
        dbms_output.put_line('Number of property :'|| property_count);

    END;
    /

C’è qualche altro modo per fare questo in modo che io possa recuperare il reale numero totale di persone in quel SOBBORGO

Alcuni dati da TAVOLO di PERSONA

       PEID FIRSTNAME       LASTNAME
    ---------- -------------------- --------------------
    STREET                   SUBURB           POST TELEPHONE
    ---------------------------------------- -------------------- ---- ------------
        30 Robert       Williams
    1/326 Coogee Bay Rd.             Coogee           2034 9665-0211

        32 Lily         Roy
   66 Alison Rd.                 Randwick         2031 9398-0605

        34 Jack         Hilfgott
    17 Flood St.                 Bondi            2026 9387-0573

ALCUNI DATI dalla TABELLA di PROPRIETÀ

          PNO STREET                    SUBURB       POST
    ---------- ---------------------------------------- -------------------- ----
    FIRST_LIS TYPE               PEID
    --------- -------------------- ----------
        48 66 Alison Rd.                Randwick         2031
    12-MAR-11 Commercial            8

        49 1420 Arden St.               Clovelly         2031
    27-JUN-10 Commercial               82

        50 340 Beach St.                Clovelly         2031
    05-MAY-11 Commercial               38

Mi dispiace per il modo in cui la tabella è alla ricerca .

Questo è il valore che ottengo quando eseguo lo script qui sopra.

     SQL> exec p1('Randwick')
     Number of People :50
     Number of property :33

Ho cambiato la PROCEDURA ,questo è quello che ottengo .

    SQL> create or replace PROCEDURE p1( location varchar2 ) 
    IS
        person_count NUMBER;
        property_count NUMBER;
    BEGIN
        SELECT count(p.peid) INTO person_count
        FROM person p WHERE p.suburb = location ;

        SELECT count(pp.pno) INTO property_count
        FROM property pp WHERE pp.suburb = location ;


        dbms_output.put_line('Number of People :'|| person_count);
        dbms_output.put_line('Number of property :'|| property_count);

    END;
    /
      2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17  
    Procedure created.

    SQL> exec p1('KINGSFORD')
    Number of People :0
    Number of property :0

    PL/SQL procedure successfully completed.

    SQL> 


    SQL> 
    SQL> exec p1('Randwick')
    Number of People :0
    Number of property :0

    PL/SQL procedure successfully completed.

    SQL> 

La soluzione dovrebbe essere questa

    SQL> exec p1('randwick');
    Number of People: 7
    Number of Property: 2
si prega di mostrare alcuni dati da 2 tabelle e il valore del param suburb
I tuoi due ultimi esempi diversi. Il penultimo dice che è fornire ‘Randwick’ e l’ultimo dice che è fornire ‘randwick’ (con una “r”). Si problema è probabilmente associati con la come conservare il sobborgo di valore e ciò che caso tuo parametri sono passati. Si deve uniformare al fine di controllare la partita.

OriginaleL’autore shakur007 | 2011-10-14

3 risposte

  1. 7

    Hai chiamato la variabile lo stesso campo. Nella query, suburb è cercato innanzitutto nell’ambito della query, e corrisponde al campo suburb anche se non uso il pp alias di tabella.

    Quindi sei effettivamente confrontando il campo con se stesso, quindi ottenere tutti i record (dove suburb NON è NULL, che è). La procedura di parametro non viene utilizzato nella query.

    La soluzione: modificare il nome del parametro di procedura.

    Per evitare errori come questo, io uso sempre P_ come prefisso per la procedura/funzione di parametri e V_ come prefisso per le variabili locali. In questo modo, essi non si mescolano con i nomi di campo.

    Se cambio il sobborgo di vsuburb , ottengo 0 come il conteggio totale.
    Quindi, il valore passato in vsuburb non è corretto. Nota che le ricerche sono case sensitive. Ci deve essere una corrispondenza esatta. In caso di dubbio, si prega di modificare la tua domanda ed aggiungere la nuova procedura e il codice che chiama (compreso il valore che viene passato).
    Vedo la tua modifica e credo di conoscere (o ‘a’) problema: se si utilizza count(pp.pno), pp.pno non deve essere NULLO, altrimenti count restituisce 0. Cambiare * o a un valore costante come 1 o 'x', a meno che non si desidera contare solo i record in cui il valore non null infatti.
    Nota anche che location è una parola riservata, anche se non so esattamente se potrebbe essere usato qui. Si prega di provare con un nome diverso o aggiungere un prefisso come ho suggerito prima.
    “Io uso sempre P_ come prefisso per la procedura/funzione di parametri e V_ come prefisso per le variabili locali” — so che questo è molto comune l’abitudine, ma io odio il disordine che rende l’interfaccia per il codice pl/sql.

    OriginaleL’autore GolezTrol

  2. 1

    Anche se sono d’accordo che la causa del problema è un namespace problema di SQL e PL/SQL, SQL motore ha “catturato” il nome della PL/SQL variabile, non credo che cambiando il nome del parametro è l’approccio migliore. Se questo poi si rovina ogni sviluppatore per avviare il prefisso di ogni parametro nome con la “p” o di qualche altro inutile appendice, e per assicurarsi che essi non creare una colonna con un P_ prefisso.

    Se si guarda attraverso il PL/SQL Fornito Pacchetti di documentazione si vede molto pochi, se del caso, i casi in cui Oracle fanno questo, anche se hanno in passato fatto evidentemente incoerente cose come riferimento per table_name come “tabname”.

    Un approccio più energico è prefisso il nome della variabile con la procedura pl/sql nome quando si fa riferimento in SQL:

    SELECT count(*)
    INTO   person_count
    FROM   person p WHERE p.suburb = p1.suburb ;

    Nel tuo caso è chiaramente non il nome della procedura “P1” in realtà, quindi, vi piacerebbe avere qualcosa come:

    SELECT count(*)
    INTO   person_count
    FROM   person p WHERE p.suburb = count_suburb_objects.suburb ;

    Il tuo codice ora è immune al nome della variabile che cattura — come bonus il vostro editor di testo potrebbe evidenziare tutti i casi in cui hai utilizzato il nome di una variabile in una istruzione SQL quando si fa doppio clic sul nome della procedura.

    +1 Questo approccio consente inoltre di identificare l’ambito di applicazione di una variabile quando si hanno nidificato le procedure.

    OriginaleL’autore David Aldridge

  3. 0

    Primo, creare indici per la ricerca case-insensitive:

    CREATE INDEX idx_person_suburb_u ON person(upper(suburb))
    /
    CREATE INDEX idx_property_suburb_u ON property(upper(suburb))
    /

    Secondo, utilizzare i prefissi per la procedura di parametri e variabili locali:

    CREATE OR REPLACE PROCEDURE p1(p_location VARCHAR2) 
    IS
        v_person_count    NUMBER;
        v_property_count  NUMBER; 
        v_location        VARCHAR2(32767);
    BEGIN
        IF p_location IS NOT NULL THEN
          v_location := upper(p_location);
          SELECT count(*) INTO v_person_count
          FROM person WHERE upper(suburb) = v_location ;
    
          SELECT count(*) INTO v_property_count
          FROM property WHERE upper(suburb) = v_location ;
        ELSE
          SELECT count(*) INTO v_person_count
          FROM person WHERE upper(suburb) IS NULL;
    
          SELECT count(*) INTO v_property_count
          FROM property WHERE upper(suburb) IS NULL;        
        END IF;
        dbms_output.put_line('Number of People :' || v_person_count);
        dbms_output.put_line('Number of Property :' || v_property_count);
    END;
    /
    conte(1) e count(*) sono la stessa cosa: asktom.oracle.com/pls/asktom/…

    OriginaleL’autore vemcaster

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *