2012-12-07 76 views

回答

2

它是一個替代變量 - 一個sql * plus功能 - 它不能以這種方式工作。您必須撥打undefine &slnoaccept slno ...以使其接受另一個輸入,但這些也是sqlplus,而不是pl/sql命令,因此您將無法在循環中調用它們,

可能是唯一可以的在這裏做的是

INSERT INTO TEST_TABLE VALUES('&slno1',SYSDATE); 
INSERT INTO TEST_TABLE VALUES('&slno2',SYSDATE); 
INSERT INTO TEST_TABLE VALUES('&slno3',SYSDATE); 
INSERT INTO TEST_TABLE VALUES('&slno4',SYSDATE); 
INSERT INTO TEST_TABLE VALUES('&slno5',SYSDATE); 

更新

22:38:59 @> conn system/[email protected]_sandbox 
Connected. 
22:39:01 [email protected]_sandbox> @s:\test 
Enter value for var1: a 
Enter value for var2: b 
Enter value for var3: c 
22:39:06 [email protected]_sandbox> commit; 
22:39:11 [email protected]_sandbox> select * from test_table; 

COL1  COL2 
---------- ------------------- 
a   07.12.2012 22:39:10 
b   07.12.2012 22:39:11 
c   07.12.2012 22:39:11 
22:39:17 [email protected]_sandbox> get s:\test 
    1 set echo off 
    2 set define off 
    3 set termout off 
    4 set feedback off 
    5 set timing off 
    6 spool s:\123.sql 
    7 begin 
    8 for i in 1 .. 3 loop 
    9  dbms_output.put_line('insert into test_table values(''&var'||i||''', sysdate);'); 
10 end loop; 
11 end; 
12/
13 spool off 
14 set define "&" 
15 set termout on 
16* @s:\123.sql 
22:39:24 17 . 
22:39:58 [email protected]_sandbox> get s:\123.sql 
    1 insert into test_table values('&var1', sysdate); 
    2 insert into test_table values('&var2', sysdate); 
    3* insert into test_table values('&var3', sysdate); 
22:40:04 [email protected]_sandbox> 
+0

謝謝。我真的想知道爲什麼? –

+0

@ user1885651你能指定你的「爲什麼」指的是什麼? –

+0

爲什麼它沒有奏效? –

1

:幸運的是,你可以通過generaing的獨立順序語句接受獨立的輸入列表工作圍繞這個只有在所有的替換變量被解析並被客戶端取代之後,纔會將最終的命令,查詢或pl/sq塊發送到數據庫引擎以供執行。爲此,不可能在循環中重複提示。因此,作爲另一種替代to the @be here now answer,您可能會按如下方式重寫您的pl/sql塊:

SQL> set verify off 

SQL> declare 
    2 type T_variables is table of varchar2(11); 
    3 l_varlist T_variables; 
    4 begin 
    5 select v 
    6  bulk collect into l_varlist -- Assume that there are not so many of them 
    7  from (select '&var1' as v from dual union all 
    8    select '&var2' from dual union all 
    9    select '&var3' from dual 
10   ) ; 
11 
12 for i in l_varlist.first..l_varlist.last 
13 loop 
14  insert into test_table(col1, col2) 
15  values(l_varlist(i), sysdate); 
16 end loop; 
17 end; 
18 
19/
Enter value for var1: value #1 
Enter value for var2: value #2 
Enter value for var3: value #3 

PL/SQL procedure successfully completed. 

SQL> commit; 

Commit complete. 

SQL> select * 
    2 from test_table; 

COL1  COL2                 
----------- ---------               
value #1 07-DEC-12               
value #2 07-DEC-12               
value #3 07-DEC-12 
+0

這對我來說是新東西。但是非常感謝你。 –

相關問題