Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在Oracle SQL*plus脚本中以编程方式构造替换变量的名称?_Oracle_Plsql_Sqlplus - Fatal编程技术网

是否可以在Oracle SQL*plus脚本中以编程方式构造替换变量的名称?

是否可以在Oracle SQL*plus脚本中以编程方式构造替换变量的名称?,oracle,plsql,sqlplus,Oracle,Plsql,Sqlplus,我正在尝试编写一个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) =

我正在尝试编写一个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';
当需要构建executeimmediate字符串时,我想使用某种循环来实现这一点。正在传入的所有参数仅编号为&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,当然认为它是一个名为i的参数,而且由于调度应用程序(Appworx…ugh)没有运行define i=something,因此失败得很惨


在这种情况下,是否有任何方法可以进行间接寻址,这样我就可以迭代给定过程中有多少次是正确的

您想创建动态sql,但不知道将涉及多少参数。不要为“新”方法操心。它对您不起作用,因为您不知道将有多少个参数


基本上,您将通过连接创建动态sql,但参数将存储在
sys\u上下文中
,以便查询具有绑定。这有助于像SQL注入这样的额外功能。

您可以使用新的值和默认的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
现在使用
@test3 4调用

输出:

calling procedure my_proc(3 ,4 )
calling procedure my_proc(1 ,2 ,3 )
或使用
@test1 2 3

输出:

calling procedure my_proc(3 ,4 )
calling procedure my_proc(1 ,2 ,3 )
现在,您需要扩展到最大预期参数数


(请注意,您必须登录才能执行此操作,否则,
select from dual
将自动失败。)

是否删除&from&i?它只是一个变量,对吗?是的,但我需要(在循环中)添加第4个参数,然后是第5个参数,然后是第6个参数,依此类推,直到我获取了这个脚本文件的所有参数。我需要扩展到&4,然后扩展到&5,等等。Tom Kyte自己提出了一种不同的方法,你总是使用所有绑定变量(从上面的文章链接),如果你不知道会有多少绑定变量,这很难做到。你是对的,当然,我在考虑一个具有固定数量参数的过程,在这个过程中,您只想使用非空参数来限制结果集。很抱歉