PLSQL ORACLE中的COUNT

sha*_*007 0 oracle plsql

我以前问过这个问题,但我没有得到任何帮助.我想在给定属性的情况下获取两个不同表中的行数.这是我的代码.我没有获取条件所在的总计数,而是得到了表的整数

    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;
    /
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以做到这一点,以便我可以检索该SUBURB中的真实人数

来自PERSON TABLE的一些数据

       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
Run Code Online (Sandbox Code Playgroud)

来自PROPERTY TABLE的一些数据

          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
Run Code Online (Sandbox Code Playgroud)

对不起桌子的样子.

这是我运行上面脚本时得到的值.

     SQL> exec p1('Randwick')
     Number of People :50
     Number of property :33
Run Code Online (Sandbox Code Playgroud)

我改变了PROCEDURE,这就是我得到的.

    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> 
Run Code Online (Sandbox Code Playgroud)

解决方案就是这样

    SQL> exec p1('randwick');
    Number of People: 7
    Number of Property: 2
Run Code Online (Sandbox Code Playgroud)

Gol*_*rol 7

您将变量命名为与字段相同.在查询中,suburb首先在查询范围内查找,并且suburb即使它不使用pp表别名,它也匹配该字段.

所以你实际上是将字段与自身进行比较,因此得到所有记录(其中suburbnot NULL,即).查询中根本不使用过程参数.

解决方案:更改过程参数的名称.

为了防止这样的错误,我总是使用P_过程/函数参数V_的前缀和局部变量的前缀.这样,他们就不会与字段名称混在一起.