2012-07-18 31 views
1

我正在尝试编写一个运行单个任意过程的sql * plus脚本。棘手的部分是我希望能够运行该过程,而不管该过程需要多少个参数。是否可以通过编程在Oracle SQL * plus脚本中构造替换变量的名称?

为了找出正确的参数号的程序,我做了以下内容:

SELECT COUNT(*) INTO v_in 
    FROM all_arguments 
    WHERE LOWER(owner) = LOWER(v_schema) 
    AND LOWER(package_name) = LOWER(v_package) 
    AND LOWER(object_name) = LOWER(v_proc) 
    AND in_out = 'IN'; 

当谈到时间来建立执行,立即串,我想用一些循环要做到这一点。参数全部正在通过编号,& 1到& n。

FOR i IN 1..v_in 
    LOOP 
    v_block := v_block || '''' || &i || ''''; 
    IF i != v_in THEN 
    v_block := v_block || ','; 
    END IF; 
    END LOOP; 

但这不起作用。它看到&我当然认为它是一个名为i的参数,并且由于调度应用程序(Appworx ...呃)没有运行定义i =某事,所以这个失败惨不忍睹。

有没有什么办法可以做到这一点间接,这样我可以迭代通过,但是很多对于给定的过程恰好是正确的?

+0

下降的*&*从*我*?这只是一个变量,对吧? – 2012-07-18 20:23:52

+0

是的,但我需要(在循环中)添加第四个参数,然后是第五个参数,然后是第六个参数,依此类推,直到我已经抓取了此脚本文件的所有参数。我需要一些扩展到&4,然后到&5等的东西。 – 2012-07-18 20:30:57

回答

1

你可以用new_value和默认的SQL * Plus参数来欺骗它。

创建这样一个脚本,例如说TEST.SQL:

-- hide output 
set termout off 

-- define parameter variables to be set with new_value 
col par1 new_value 1 noprint 
col par2 new_value 2 noprint 
col par3 new_value 3 noprint 

-- initialize parameter variables 
select 1 par1, 2 par2, 3 par3 from dual where 1=2; 

-- append comma to parameter variables, not needed for first parameter 
select nullif(','||'&2',',') par2, nullif(','||'&3',',') par3 from dual; 

-- show output 
set termout on 

-- you actual script starts here 
prompt calling procedure my_proc(&1 &2 &3) 

-- for next run 
undef 1 
undef 2 
undef 3 

现在打电话与@test 3 4

输出:

calling procedure my_proc(3 ,4) 

或致电与@test 1 2 3

输出:

calling procedure my_proc(1 ,2 ,3) 

现在您需要将其扩展到您的参数的最大预期数量。

(请注意,您必须登录,使这项工作,否则将select from dual默默地失败。)

1

你想制作动态sql,不知道将涉及多少个参数。 Asktom has the authoritative answer for this。不要打扰“新”的方法。它不适合你,因为你不知道有多少参数。

基本上,您将通过串联创建动态sql,但参数将存储在sys_context中,以便查询将具有绑定。这有助于像SQL注入这样的事情。

+0

Tom Kyte自己提出了一种不同的方法,您总是使用所有绑定变量(它与上述文章链接),请参阅http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID:1669972300346534908 – 2012-07-19 06:25:52

+1

如果你不知道有多少个绑定变量,那很难做到。 – 2012-07-19 12:44:52

+0

你是对的,当然 - 我正在考虑一个程序有一个固定数量的参数,你只想使用非空参数来限制结果集。抱歉。 – 2012-07-19 19:19:36

相关问题