我经常在脚本中使用替换变量而不必复制内容:
define my_table = 'dual'; -- bad example
其中:
ng-include
但是当我切换到另一个流时,我经常需要更改 my_table (因为另一个表成为我查询的中心点)。
我可以为变量创建这些类型的数组吗? (显然我在周围搜索并没有找到怎么做,但是我能做什么才能循环遍历一组值,在我的情况下表名,填写变量中的每个表并再次运行所有查询,又一次?)
答案 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,管道功能,脚本生成。