[英]Querying the result of a Procedure, PL/SQL ( Oracle DBMS )
我已经编写了一个程序来检查物业的空置房间数量。
CREATE OR REPLACE PROCEDURE prop_vacancy_query(
p_property_id properties.tracking_id%TYPE
)
IS
property_refcur SYS_REFCURSOR;
v_prop_rooms properties.num_rooms%TYPE;
BEGIN
OPEN property_refcur FOR
'SELECT COUNT(room_status) FROM rooms
JOIN properties ON
properties.property_id = rooms.property_id
WHERE room_status = :status AND properties.tracking_id = :track_id' USING 'VACANT', p_property_id;
LOOP
FETCH property_refcur INTO v_prop_rooms;
EXIT WHEN property_refcur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(' ');
DBMS_OUTPUT.PUT_LINE('Available Rooms: ' || v_prop_rooms);
END LOOP;
CLOSE property_refcur;
END;
我想在触发器中使用此过程来在可用客房数量返回为0时自动将属性的状态也设置为“ OCCUPIED”。
我努力了
IF prop_vacancy_query(:NEW.property_status) = 0 THEN
:NEW.property_status := 'OCCUPIED';
END IF;
但这是行不通的。 如何在触发器中使用条件逻辑调用此过程? 或者这是不可能的。
注意:我也担心这可能带来的性能问题,我不确定在数据库更新时我还能如何处理自动更新,任何对如何解决此问题的建议将不胜感激。
首先,如果您有一段代码的唯一目的是运行查询并返回一个值,请使用FUNCTION
而不是PROCEDURE
。 程序应该对数据进行某种处理。
其次,如果不需要动态SQL,请不要使用动态SQL。 它通常要慢一些,但更重要的是,它的编写,支持和调试要困难得多。 另外,您会将编译时异常转换为运行时异常,因此,在尝试运行代码之前,您不会发现语法错误。
您可以极大地简化代码
CREATE OR REPLACE FUNCTION get_num_vacancies(
p_property_id properties.tracking_id%TYPE
)
RETURN NUMBER
IS
v_prop_rooms properties.num_rooms%TYPE;
BEGIN
SELECT COUNT(room_status)
INTO v_prop_rooms
FROM rooms
JOIN properties ON
properties.property_id = rooms.property_id
WHERE room_status = 'VACANT'
AND properties.tracking_id = p_property_id;
RETURN v_prop_rooms;
END;
然后,您可以按照原来想要的方式调用该函数
IF prop_vacancy_query(:NEW.property_status) = 0 THEN
:NEW.property_status := 'OCCUPIED';
END IF;
CREATE OR REPLACE PROCEDURE prop_vacancy_query(
p_property_id properties.tracking_id%TYPE
status OUT NUMBER
)
.
.
.
status := 0
END;
/
并这样打电话
outstatus NUMBER:= -1;
prop_vacancy_query(:NEW.property_id,outstatus);
IF out status = 0 THEN
:NEW.property_status := 'OCCUPIED';
END IF;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.