繁体   English   中英

查询过程PL / SQL的结果(Oracle DBMS)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM