运行重载的PLSQL存储过程时不需要的搜索结果

时间:2015-06-23 01:39:42

标签: oracle stored-procedures plsql

我正在创建一个重载的PLSQL存储过程,它允许显示学校的名称,它们对应的类别(小学等)以及它们所属的邻域。

学校名称取自字段OTTAWASCHOOLS中的表NAME。该类别来自字段OTTAWASCHOOLS中的表格CATEGORY

此外,用户可以选择输入特定的社区,以查找该社区中学校的上述信息。邻域的名称取自字段OTTAWANEIGHBOUR中的NAME表。

但是,如果用户没有输入特定的邻域,则输出将显示OTTAWASCHOOLS表中所有学校的名称及其各自的邻域和类别

(目前我只创建了一个程序)。

我的代码如下

SET SERVEROUTPUT ON;
SET VERIFY OFF

CREATE OR REPLACE PACKAGE schools_package 
AS

PROCEDURE find_school
(neighbourhood_name     IN  OTTAWANEIGHBOUR.NAME%TYPE);
END schools_package;
/

CREATE OR REPLACE PACKAGE BODY schools_package
AS
PROCEDURE find_school
(neighbourhood_name     IN  OTTAWANEIGHBOUR.NAME%TYPE)
IS

school_category             OTTAWASCHOOLS.CATEGORY%TYPE;
school_name                 OTTAWASCHOOLS.NAME%TYPE;
v_neighbourhood_name        OTTAWANEIGHBOUR.NAME%TYPE;

CURSOR c_schools IS
SELECT NAME, CATEGORY
FROM eluliGDM.OTTAWASCHOOLS;

r_schools c_schools%ROWTYPE;

BEGIN

    DBMS_OUTPUT.PUT_LINE ('NEIGHBOURHOOD  ' || 'CATEGORY  '|| 'SCHOOL NAME  ');
    DBMS_OUTPUT.PUT_LINE ('-------------  ' || '--------  '|| '-----------  ');

FOR r_schools IN c_schools
    LOOP
    SELECT c1.NAME, c2.NAME, c2.CATEGORY
    INTO v_neighbourhood_name, school_name, school_category
    FROM eluliGDM.OTTAWANEIGHBOUR c1, eluliGDM.OTTAWASCHOOLS c2
    WHERE  SDO_RELATE (c2.GEOMETRY, c1.GEOMETRY, 'MASK=INSIDE+COVEREDBY QUERYTYPE=JOIN') = 'TRUE'
    AND c2.NAME=r_schools.NAME;

    DBMS_OUTPUT.PUT_LINE (v_neighbourhood_name || school_category|| school_name);
END LOOP;
END find_school;
END schools_package;

-----------TESTING STORED PROCEDURE---------------
Execute schools_package.find_school();
Execute schools_package.find_school('Mer Bleue');

然而,结果显示了所有社区及其相应的学校(即使我在测试过程时指定了一个社区)

1 个答案:

答案 0 :(得分:1)

光标中缺少Where子句。由于没有where子句,即使您在过程中传递了邻居名称,也会在游标中返回所有邻域。

CURSOR c_schools IS
SELECT NAME, CATEGORY
FROM eluliGDM.OTTAWASCHOOLS;
--> WHERE name = neighbourhood_name
相关问题