这里有两个问题。 identifier ONE must be declared 消息是因为您没有引用替换变量。如果你有set verify on,那么你会看到类似:
Enter value for source_ats_user_schema: ONE
old 2: source varchar2(100) := &SOURCE_ATS_USER_SCHEMA;
new 2: source varchar2(100) := ONE;
source varchar2(100) := ONE;
*
ERROR at line 2:
ORA-06550: line 2, column 25:
PLS-00201: identifier 'SCOTT' must be declared
ORA-06550: line 2, column 8:
PL/SQL: Item ignored
*'d 的位置表明它不知道ONE 的含义。既然你希望它在这里被视为一个字符串,你需要这样做:
source varchar2(100) := '&SOURCE_ATS_USER_SCHEMA';
...这将显示:
Enter value for source_ats_user_schema: ONE
old 2: source varchar2(100) := '&SOURCE_ATS_USER_SCHEMA';
new 2: source varchar2(100) := 'ONE';
...这是有效的。就目前而言;这实际上对您没有帮助,因为您仍然有第二个错误:
select ID from source.WEB_FE;
*
ERROR at line 4:
ORA-06550: line 4, column 27:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 4, column 5:
PL/SQL: SQL Statement ignored
请注意,错误指的是source.WEB_FE,不是 ONE.WEB_FE。 source 未被替换。通常,您需要使用@NicholasKrasnov 在他的回答中显示的一种方法,但实际上您使这比需要的更复杂;在这种特定情况下,您根本不需要声明 source,您可以这样做:
CURSOR cur_list is
select ID from &SOURCE_ATS_USER_SCHEMA..WEB_FE;
请注意,与我刚才所说的相反,这里您不需要引用替换变量,但您需要用. 显式终止它,以阻止它在表名之前处理真正的.作为终结者。 (试试不带额外的. 看看如果不这样做会发生什么)。
运行时会提示,验证输出如下:
Enter value for source_ats_user_schema: ONE
old 3: select ID from &SOURCE_ATS_USER_SCHEMA..WEB_FE;
new 3: select ID from ONE.WEB_FE;
如您所见,它现在正在查找您指定的架构中的表。这仍然是动态的,但以一种特殊的 SQL*Plus 方式。
不过,对于这些方法中的任何一种,您都需要考虑 SQL 注入的可能性。