2017-02-06 81 views
2

我有收到一個記錄作爲一個IN參數(該過程也有一個OUT參數。)如何檢查記錄爲空

CREATE OR REPLACE PACKAGE p 
    PROCEDURE p_select(p_filter_params IN t_filter_params 
        , p_order_list OUT SYS_REFCURSOR); 
END p; 

CREATE OR REPLACE PACKAGE BODY p 
    PROCEDURE p_select(p_filter_params IN t_filter_params 
        , p_order_list OUT SYS_REFCURSOR) AS 
    BEGIN 
    IF p_filter_params IS NULL 
     THEN 
     NULL; 
    END IF; 
    END p_select, 
END p; 

可執行部分

DECLARE 
    TYPE t_filter_params IS RECORD 
    (f_name customers.cust_first_name%TYPE 
    , l_name customers.cust_last_name%TYPE 
    , city  customers.cust_address.city%TYPE 
    , from_date orders.order_date%TYPE 
    , to_date orders.order_date%TYPE); 

    vr_params t_filter_params; 

    TYPE ref_cursor IS REF CURSOR; 

    v_cursor ref_cursor; 

BEGIN 
    /*vr_params.f_name := 'john'; 
    vr_params.l_name := 'smith'; 
    vr_params.city := 'Dallas'; 
    vr_params.from_date := SYSDATE - 100; 
    vr_params.to_date := SYSDATE;*/ 

    --p.p_select(vr_params, v_cursor); 
    p.p_select(null, v_cursor); 
end; 

一個程序,有人告訴我如何使程序中的IF聲明成爲可能嗎?

非常感謝, Mikcutu。

+1

有什麼問題?如果你將一個非空值傳遞給過程,它如何工作? – smnbbrv

+0

@smnbbrv:對不起,我不明白你的問題。 – mikcutu

+0

您在詢問記錄是否爲空。但。你在這裏傳遞一個絕對爲'NOT NULL'的記錄'p.p_select(vr_params,v_cursor);'。所以問題是,你爲什麼期望你的'if'工作? – smnbbrv

回答

0

記錄有點特別。如果您將記錄設置爲null,則所有記錄屬性均設置爲空,但記錄本身仍然存在。

我想到的第一件事情是要麼檢查某種id在記錄上是否爲空 - 這意味着記錄是空的。

您沒有ID,但這可能會導致另一種解決方案:添加另一個屬性,該屬性在其未填充時爲null。

第三種方法:只是通過每個屬性,並檢查是否每個屬性is null

最後,最好的,拒絕使用RECORD並使用OBJECT來代替:它的工作原理與您期望的一樣。

0

我相信你不能:

SQL> create or replace package p is 
    2  type tType is record (a number, b number); 
    3  -- 
    4  procedure proc(pIn IN tType); 
    5 end; 
    6/

Package created. 

SQL> create or replace package body p is 
    2  procedure proc(pIn IN tType) is 
    3  begin 
    4   if pIn is null then 
    5    dbms_output.put_line('NULL'); 
    6   else 
    7    dbms_output.put_line('NOT NULL'); 
    8   end if; 
    9  end; 
10 end; 
11/

Warning: Package Body created with compilation errors. 

SQL> sho err 
Errors for PACKAGE BODY P: 

LINE/COL ERROR 
-------- ----------------------------------------------------------------- 
4/9  PL/SQL: Statement ignored 
4/12  PLS-00306: wrong number or types of arguments in call to 'IS 
     NULL' 

有了一個稍微不同的方法,你可以使用一個模式級別類型:

SQL> create or replace type tType is object (a number, b number); 
    2/

Type created. 

SQL> create or replace package p2 is 
    2  -- 
    3  procedure proc(pIn IN tType); 
    4 end; 
    5/

Package created. 

SQL> create or replace package body p2 is 
    2  procedure proc(pIn IN tType) is 
    3  begin 
    4   if pIn is null then 
    5    dbms_output.put_line('NULL'); 
    6   else 
    7    dbms_output.put_line('NOT NULL'); 
    8   end if; 
    9  end; 
10 end; 
11/

Package body created. 

SQL> 
+0

在第一個示例中,您可以使用本地記錄類型使其工作,但您必須引用類型中的每個單獨組件,而不是類型本身,例如, IF pIn.f_name爲NULL THEN。 。 。 。 – BriteSponge

0

不要複雜的事情經過的記錄,只是通過個別參數:

CREATE OR REPLACE PACKAGE p 
AS 
    PROCEDURE p_select(
    in_f_name customers.cust_first_name%TYPE 
    , in_l_name customers.cust_last_name%TYPE 
    , in_city  customers.cust_address.city%TYPE 
    , in_from_date orders.order_date%TYPE 
    , in_to_date orders.order_date%TYPE 
    , out_order_list OUT SYS_REFCURSOR 
); 
END p; 

CREATE OR REPLACE PACKAGE BODY p 
AS 
    PROCEDURE p_select(
    in_f_name customers.cust_first_name%TYPE 
    , in_l_name customers.cust_last_name%TYPE 
    , in_city  customers.cust_address.city%TYPE 
    , in_from_date orders.order_date%TYPE 
    , in_to_date orders.order_date%TYPE 
    , out_order_list OUT SYS_REFCURSOR 
) AS 
    BEGIN 
    OPEN out_order_list FOR 
    SELECT * 
    FROM orders o INNER JOIN customers c ON (o.customer_id = c.customer_id) 
    WHERE (in_f_name IS NULL OR c.cust_first_name = in_f_name) 
    OR  (in_l_name IS NULL OR c.cust_last_name = in_l_name) 
    OR  (in_city IS NULL OR c.cust_address.city = in_city) 
    OR  (in_from_date IS NULL OR o.order_date >= in_from_date) 
    OR  (in_to_date IS NULL OR o.order_date <= in_to_date); 
    END p_select, 
END p;