您可以将一系列参数传递给存储过程

时间:2018-02-22 18:10:16

标签: sql stored-procedures

我有一个使用year参数创建的存储过程。但我想知道是否有一种方法可以让我一次传递1年以上的存储过程?

因此,不是必须在2012年运行一次,而是在2013年等运行一次,有没有办法设置它,我可以传递一个范围或一系列参数,让它为每一个运行?

2 个答案:

答案 0 :(得分:0)

AFAIK没有简单的方法将值数组传递给存储过程。但是您可以通过多种方法来解决最明显的xml参数问题。我个人喜欢传递一个以逗号分隔的值列表,并在存储过程中自己解析。

答案 1 :(得分:0)

这个答案适用于PL / SQL(Oracle过程语言)。如果您的数据库不同,语法可能会有所不同,但想法应该是相同的。

假设您的程序如下所示:

create or replace procedure do_something( y in number )
as
begin
  if y = trunc(y) and y between 2000 and 2020
  then
      dbms_output.put_line('Your input was: ' || to_char(y, '9999'));
  else
      dbms_output.put_line('You did not input a year between 2000 and 2020');
  end if;
end;
/

Procedure DO_SOMETHING compiled

你通常这样称呼它。由于过程输出到输出缓冲区,首先要确保将SET SERVEROUTPUT ON定向到屏幕。

set serveroutput on

begin
  do_something(2018);
end;
/

PL/SQL procedure successfully completed.

Your input was:  2018

现在假设你需要运行2018年,2019年,2020年,2021年的程序 - 并且你想要自动化它。通过在匿名过程中编写循环来调用您的do_something过程:

begin
  for yr in 2018..2021
  loop
    do_something(yr);
  end loop;
end;
/

PL/SQL procedure successfully completed.

Your input was:  2018
Your input was:  2019
Your input was:  2020
You did not input a year between 2000 and 2020

对于更一般的情况,您需要提供输入列表(以某种任意顺序),您可以创建一个值表并循环它。

declare
  type num_tbl_type is table of number;
  inputs num_tbl_type := num_tbl_type(2013, 2022, 2016);
begin
  for idx in 1..inputs.count
  loop
    do_something(inputs(idx));
  end loop;
end;
/

PL/SQL procedure successfully completed.

Your input was:  2013
You did not input a year between 2000 and 2020
Your input was:  2016