使用过程

时间:2016-01-15 10:53:28

标签: plsql parameters oracle11g

我需要创建一个过程作为参数接收一个月和一年。

在程序中我需要有一个查询来检索一些值,这些值必须考虑到收到的参数。

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')

但如果我收到MONTH = 3 ..我需要选择AND M_CODE IN ('1','2','3')

那么为了能够做到这一点,最好的方法是什么?

非常感谢

3 个答案:

答案 0 :(得分:2)

您可以将M_CODEMONTH同时作为数字并使用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;

答案 1 :(得分: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;

答案 2 :(得分: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;