我以前问过这个问题,但我没有得到任何帮助.我想在给定属性的情况下获取两个不同表中的行数.这是我的代码.我没有获取条件所在的总计数,而是得到了表的整数
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)
您将变量命名为与字段相同.在查询中,suburb首先在查询范围内查找,并且suburb即使它不使用pp表别名,它也匹配该字段.
所以你实际上是将字段与自身进行比较,因此得到所有记录(其中suburbnot NULL,即).查询中根本不使用过程参数.
解决方案:更改过程参数的名称.
为了防止这样的错误,我总是使用P_过程/函数参数V_的前缀和局部变量的前缀.这样,他们就不会与字段名称混在一起.