你这里有两个问题。该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;
请注意,与我刚才所说的相反,这里您不需要引用替换变量,但您确实需要用 a 显式终止它.
,以阻止它将.
表名之前的实数视为终止符。(试一试没有额外.
的,看看如果你不这样做会发生什么)。
当您运行它时,它会提示并且验证输出将如下所示:
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 注入的可能性。