Plsql 在过程中使用参数

Plsql 在过程中使用参数,plsql,parameters,oracle11g,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_代

我需要创建一个过程,该过程每月和每年接收一个参数

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

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_代码应该具有从年初到参数接收月份的值

例如,如果我收到一个4月份的in作为参数,我希望我的select像这样,M_代码在'1','2','3','4'

但是如果我收到月=3。。我需要“1”、“2”、“3”中的select to have和M_代码

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


非常感谢

您可以将M_代码和月份都转换为数字并在运算符之间使用,或者只您可以将M_代码和月份都转换为数字并在运算符之间使用,或者只您可以执行以下示例之类的操作,以使您的过程更加动态

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;

您可以执行以下示例之类的操作,使您的过程更加动态

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;
这只是一个可以考虑的选择

这只是一个可以考虑的选择


关于_NUMBERM_代码关于_NUMBERM_代码非常感谢您的时间。它很好用。我怎样才能学到更多,并练习一些练习来了解更多关于pls/sql的知识?非常感谢您的时间。它很好用。我如何学习更多知识并练习一些练习来了解更多关于pls/sql的知识?
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;