我正在创建一个重载的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');
然而,结果显示了所有社区及其相应的学校(即使我在测试过程时指定了一个社区)
答案 0 :(得分:1)
光标中缺少Where子句。由于没有where子句,即使您在过程中传递了邻居名称,也会在游标中返回所有邻域。
CURSOR c_schools IS
SELECT NAME, CATEGORY
FROM eluliGDM.OTTAWASCHOOLS;
--> WHERE name = neighbourhood_name