2016-01-15 9 views
0

Мне нужно создать процедуру, которая получает в качестве параметра месяц и год.Использование параметров в процедурах

Внутри процедуры мне нужно получить запрос на получение некоторых значений, которые должны принимать во внимание полученные параметры.

create or replace procedure GET_REVS(MONTH in VARCHAR2,YEAR in varchar2) is 
SELECT 
    *     
FROM 
    REVENUS_TABLE 
    WHERE 
     Y_CODE IN ('YEAR') 
    AND M_CODE IN() 

Теперь M_CODE должны иметь значения с начала года до месяца, полученного параметра.

Пример, если я получаю в качестве параметра в течение месяца 4 я хочу, чтобы мой выбор, чтобы, как это и M_CODE IN ('1','2','3','4')

Но если я получаю МЕСЯЦ = 3 .. мне нужно выбрать, чтобы иметь AND M_CODE IN ('1','2','3')

Так Каков наилучший способ сделать процедуру, чтобы иметь возможность сделать это?

Большое спасибо

+0

насчет 'to_number (M_CODE) <= TO_NUMBER (МЕСЯЦ)'? Не будет ли это работать? – Nitish

ответ

2

Вы могли бы бросить как M_CODE и MONTH как числа и использовать BETWEEN оператора или просто < =:

CREATE OR REPLACE PROCEDURE get_revs(month IN VARCHAR2, year IN VARCHAR2) IS 
BEGIN 
    .... 
    SELECT * 
    FROM revenus_table 
    WHERE y_code = year 
    AND TO_NUMBER(m_code) BETWEEN 1 AND TO_NUMBER(month); 
    ... 
END; 
+0

Большое спасибо за ваше время. Он работает нормально. Как я могу узнать больше и оценить некоторые упражнения, чтобы узнать больше о pls/sql? – UcanDoIt

1

Вы можете сделать некоторые вещи, как показано ниже, например, чтобы сделать вашу процедуру более динамичной

CREATE OR REPLACE PROCEDURE get_revs (
    MONTH IN VARCHAR2, 
    YEAR IN VARCHAR2 
) 
IS 
    variable_name table_name%ROWTYPE; 
    v_sql   VARCHAR2 (1000) 
     := 'SELECT * FROM REVENUS_TABLE WHERE  Y_CODE IN (' 
    || MONTH 
    || ')'; 
BEGIN 
    IF MONTH = 4 THEN 
     v_sql := v_sql || ' and M_CODE IN (''1'',''2'',''3'',''4'')'; 
    END IF; 

    IF MONTH = 3 THEN 
     v_sql := v_sql || 'and M_CODE IN (''1'',''2'',''3'')'; 
    END IF; 

    EXECUTE IMMEDIATE v_sql 
    INTO    variable_name; 
END; 
0

Просто альтернатива думать о.

CREATE OR REPLACE PROCEDURE get_revs(month IN VARCHAR2, year IN VARCHAR2) IS 
lv_in_clause VARCHAR2(100 CHAR); 
p_ref sys_refcursor; 
BEGIN 
    SELECT 'IN (' 
    ||WMSYS.WM_CONCAT(A.NUM) 
    ||')' 
    INTO lv_in_clause 
    FROM 
    (SELECT '''' 
     ||LEVEL 
     ||'''' NUM, 
     1 ID1 
    FROM DUAL 
     CONNECT BY LEVEL < to_number(MONTH) 
    )A 
    GROUP BY a.ID1; 
    OPEN p_ref FOR 'SELECT * 
FROM revenus_table 
WHERE y_code = '|| year 
||' AND m_code '||lv_in_clause; 

END;