我有以下PL/SQL塊:在oracle 10g中,如何接受循環中的用戶輸入?
BEGIN
FOR I IN 1 .. 5
LOOP
INSERT INTO TEST_TABLE VALUES('&slno',SYSDATE);
END LOOP;
END;
當我執行上述嵌段它正在採取只有一個輸入。 但它總共需要5個輸入。 我的代碼中缺少什麼?任何人都可以幫助我嗎?
我有以下PL/SQL塊:在oracle 10g中,如何接受循環中的用戶輸入?
BEGIN
FOR I IN 1 .. 5
LOOP
INSERT INTO TEST_TABLE VALUES('&slno',SYSDATE);
END LOOP;
END;
當我執行上述嵌段它正在採取只有一個輸入。 但它總共需要5個輸入。 我的代碼中缺少什麼?任何人都可以幫助我嗎?
它是一個替代變量 - 一個sql * plus功能 - 它不能以這種方式工作。您必須撥打undefine &slno
或accept 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>
:幸運的是,你可以通過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
這對我來說是新東西。但是非常感謝你。 –
謝謝。我真的想知道爲什麼? –
@ user1885651你能指定你的「爲什麼」指的是什麼? –
爲什麼它沒有奏效? –