我有一个使用year参数创建的存储过程。但我想知道是否有一种方法可以让我一次传递1年以上的存储过程?
因此,不是必须在2012年运行一次,而是在2013年等运行一次,有没有办法设置它,我可以传递一个范围或一系列参数,让它为每一个运行?
答案 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