您在這裏有兩個問題。消息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注入的潛力。
謝謝。 source varchar2(100):='&SOURCE_ATS_USER_SCHEMA';訣竅。 – saji159