Oracle 如何";比例尺;使用循环替换变量的脚本?

Oracle 如何";比例尺;使用循环替换变量的脚本?,oracle,plsql,Oracle,Plsql,我经常在脚本中使用替换变量,以避免重复: select count(*) from &&my_table; select * from &&my_table; -- etc. -- a ton more queries here that are used often in together to check and run things 其中: define my_table = 'dual'; -- bad example 但是当我切换到另一个流时,我经常

我经常在脚本中使用替换变量,以避免重复:

select count(*) from &&my_table;
select * from &&my_table;
-- etc.
-- a ton more queries here that are used often in together to check and run things
其中:

define my_table = 'dual'; -- bad example
但是当我切换到另一个流时,我经常不得不更改我的_表(因为另一个表成为我查询的中心点)

我可以为变量创建这些类型的数组吗?(显然,我四处搜索,没有找到如何循环的方法,但是我该怎么做才能循环一组值、表名(在我的例子中),填写变量中的每个表,并一次又一次地运行所有查询?

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

是,使用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;
/

我猜您希望使用动态sql,以便可以替换表名


不完全确定您想要做什么,但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
运行为并输入以逗号分隔的表列表,例如:

Enter table comma separated list: tab1, tab2, tab3, tab4
生成的driver.sql脚本如下所示:

@worker.sql tab1
@worker.sql  tab2
@worker.sql  tab3
@worker.sql  tab4
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;
然后运行driver.sql

@driver.sql

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

@worker.sql tab1
@worker.sql  tab2
@worker.sql  tab3
@worker.sql  tab4
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、管道函数和脚本生成。

您没有抓住要点。您的解决方案中定义了替换变量的位置?您不能这样做:从my_Table中选择count(1)是的,您可以使用动态sql和绑定变量。sql:='从'| |我的|表中选择count(*)到:1;使用myCountVar执行即时sql;这不是绑定变量。这是一个正常的变量。如果可能的话,我希望避免代码生成和“执行”命令。到目前为止,替换变量还不错,但我想进一步改进我的脚本(我想循环)。您不必生成代码,只需将表名用作调用PL/SQL包/过程的参数即可。@Belun使用execute命令没有问题。它存在的原因有很多,比如你想在你的问题中实现什么。我必须自己输出文本。如果我进行选择,我必须输出结果。我不想要这个。我想在ide(oracle sql developer)必须提供的漂亮的表视图中进行选择。使用or循环您的数组并调用@Motor我需要在sql developer或其他程序中查看结果,而不仅仅是激发并忘记将脚本输出重定向到文件,并在您想要查看文件时查看该文件。dude,我想在ide的表视图中查看结果