Oracle存储过程,具有可变数量的相同类型的IN参数

时间:2013-12-06 18:47:08

标签: sql oracle stored-procedures

我有一个存储过程,如下所示:

create or replace 
PROCEDURE QueryMultipleValues
(
  VALUE_X1 IN VARCHAR2  
, VALUE_X2 IN VARCHAR2  
) AS
Cursor cur1 is
Select Table1.Value, Table2.OtherValue
From Table1
Join Table2 on Table1.OtherValue = Table2.OtherValue
Where Table2.OtherValue = VALUE_X1 or Table2.OtherValue = VALUE_X2
BEGIN
--display the results
END QueryMultipleValues;

我知道该代码中的名称含糊不清,所以如果它有帮助,我想说我正在尝试根据用作参数的ID号来获取名称列表。现在,存储过程需要两个,恰好两个输入参数。是否可以调整此代码,以便采用可变数量的输入参数?例如,'执行QueryMultipleValues(123,456,789,999)'或'执行QueryMultipleValues(123)'?我想我可以改变WHERE子句使用IN代替=,但我无法弄清楚如何让程序接受可变数量的IN参数。我真的很感激一些帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

如果要传入参数列表,则应该使用集合而不是传递多个参数。

CREATE TYPE id_arr 
    AS TABLE OF VARCHAR2(100);

create or replace PROCEDURE QueryMultipleValues (
  p_ids IN id_arr
)

如果您希望您的过程接受可变数量的参数,假设您可以提前确定要接受的最大参数数量,则可以使用可选参数定义过程

create or replace PROCEDURE QueryMultipleValues (
  p_id1 IN VARCHAR2,
  p_id2 IN VARCHAR2 = null,
  p_id3 IN VARCHAR2 = null,
  ..
  p_idN IN VARCHAR2 = null,
)
可以使用1到N个参数调用