如何"规模"使用循环替换变量的脚本?

时间:2016-06-30 11:32:50

标签: oracle plsql

我经常在脚本中使用替换变量而不必复制内容:

define my_table = 'dual'; -- bad example

其中:

ng-include

但是当我切换到另一个流时,我经常需要更改 my_table (因为另一个表成为我查询的中心点)。

我可以为变量创建这些类型的数组吗? (显然我在周围搜索并没有找到怎么做,但是我能做什么才能循环遍历一组值,在我的情况下表名,填写变量中的每个表并再次运行所有查询,又一次?

4 个答案:

答案 0 :(得分:0)

  

我可以为变量创建这些类型的数组吗?

是的,使用Oracle的集合类型:

DEFINE
  TYPE table_name_table IS TABLE OF VARCHAR2(30);
  table_names  table_name_table := table_name_table( 'TABLE1', 'TABLE2', 'DUAL' );
  my_table VARCHAR2(30);
BEGIN
  FOR i IN 1 .. table_names.COUNT LOOP
    my_table := table_names(i);
    -- process your script...
  END LOOP;
END;
/

答案 1 :(得分:0)

我想你想使用动态sql,所以你可以替换表名。

https://docs.oracle.com/cloud/latest/db112/LNPLS/dynamic.htm#LNPLS011

答案 2 :(得分:0)

不完全确定你想要做什么,但是在SQL * Plus中没有一个简单的构造。你能做的最接近的是:

运行给定表的查询的worker.sql脚本:

define &tabname='&1'

PROMPT &tabname

SELECT count(1) FROM &tabname;

接下来gendriver.sql脚本接受您的表列表并驱动工作脚本:

ACCEPT tablist CHAR PROMPT 'Enter table comma separated list: '

spool driver.sql
SET SERVEROUTPUT ON
set feedback off
set verify off
DECLARE
   L_TABLE        DBMS_UTILITY.UNCL_ARRAY;
   L_TABLELEN     BINARY_INTEGER;
BEGIN
   DBMS_UTILITY.COMMA_TO_TABLE ('&tablist', L_TABLELEN, L_TABLE);
   FOR I IN L_TABLE.FIRST .. L_TABLE.LAST
   LOOP
      IF l_table(i) IS NOT NULL THEN
         DBMS_OUTPUT.PUT_LINE( '@worker.sql ' || l_table(i) );
      END IF;
   END LOOP;
END;
/
spool off

运行as并输入逗号分隔的表列表,例如:

Enter table comma separated list: tab1, tab2, tab3, tab4

生成的driver.sql脚本如下所示:

@worker.sql tab1
@worker.sql  tab2
@worker.sql  tab3
@worker.sql  tab4

然后运行driver.sql

@driver.sql

答案 3 :(得分:0)

SQLPlus中没有循环命令。要填充变量,您可以使用以下内容:

SET verify OFF
column t1 new_value tname1
column t2 new_value tname2
select &table_name from dual;
-- Your script
select count(*) from &&tname1;
select * from &&tname1;
-- Your script again
select count(*) from &&tname2;
select * from &&tname2;

然后使用“'dual't1,'dual't2”作为table_name参数的值。

是的,我知道这不是解决方案。我不明白你想要达到什么目的。如果要为不同的表执行相同的命令集,请在SQL Developer中使用带有变量或占位符的SQL编辑器代码模板,或对不同的流使用不同的代码段。如果需要报告,请使用PL / SQL,动态sql,管道功能,脚本生成。