3

次の pl/sql ブロッ​​クがあります。

BEGIN
  FOR I IN 1 .. 5
  LOOP
    INSERT INTO TEST_TABLE VALUES('&slno',SYSDATE);
  END LOOP;
END;

上記のブロックを実行すると、入力は 1 つしかありません。ただし、合計で 5 つの入力が必要です。私のコードには何がありませんか? 誰でも私を助けてもらえますか?

4

2 に答える 2

2

これは置換変数 (sql*plus 機能) であり、この方法では機能しません。undefine &slnoorを呼び出してaccept slno ...別の入力を取る必要がありますが、これらも pl/sql コマンドではなく sqlplus であるため、ループで呼び出すことはできません。

おそらくここでしかできないことは

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);

update : 幸いなことに、独立した入力を受け入れる別々の連続したステートメントのリストを生成することで、これを回避できます。

22:38:59 @> conn system/sys@oars_sandbox
Connected.
22:39:01 SYSTEM@oars_sandbox> @s:\test
Enter value for var1: a
Enter value for var2: b
Enter value for var3: c
22:39:06 SYSTEM@oars_sandbox> commit;
22:39:11 SYSTEM@oars_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 SYSTEM@oars_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 SYSTEM@oars_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 SYSTEM@oars_sandbox>
于 2012-12-07T14:24:53.437 に答える
1

すべての置換変数が解析され、(クライアントによって) 置換された後でのみ、最終的なコマンド、クエリ、または pl/sq ブロックが実行のためにデータベース エンジンに送信されます。そのため、ループで繰り返しプロンプトを出すことはできません。したがって、 @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  
于 2012-12-07T19:58:04.450 に答える