1

私はデータベースクラスを受講していますが、クラスのラボセクションの最初に、通常、以前に作成したデータベース内のすべてのテーブルを削除する必要があります。これを動的に実行するスクリプトを実行できるようにしたかったのですが、動作させることができないようです。これが私がこれまでに持っているコードです。

declare tname string(50);
cursor ctable is select table_name from user_tables;

begin
 open ctable;
 LOOP
   FETCH ctable into tname;
   if tname != ''  then
     execute immediate 'drop table ' || tname;
   END if;
   EXIT WHEN ctable%NOTFOUND;
 END LOOP;
 close ctable;
end;

誰かが私が間違っていることについて正しい方向に私を向けることができれば、それは素晴らしいことです。ありがとう。

4

1 に答える 1

5

OracleVARCHAR2は、空の文字列を。として扱いますNULL
それで

if tname != '' then

と同じです

if tname != NULL then

定義されていないため、NULL代わりに返されます。TRUE

NULLで確認できますtname IS NOT NULL

table_nameただし、は必須でuser_tablesあるため、このチェックは必要ありません。


さらに2つのこと:

  1. %NOTFOUNDフェッチ直後に確認してください
  2. 可能であれば、変数宣言に列参照を使用します(user_tables.table_name%TYPE

したがって、コードは次のようになります。

DECLARE
  tname user_tables.table_name%TYPE;
  CURSOR ctable IS SELECT table_name FROM user_tables;
BEGIN
  OPEN ctable;
  LOOP
    FETCH ctable INTO tname;
    EXIT WHEN ctable%NOTFOUND;
    EXECUTE IMMEDIATE 'drop table ' || tname;
  END LOOP;
  CLOSE ctable;
END;

読みやすくするために暗黙カーソルを使用することもできます。

BEGIN
  FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
    EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
  END LOOP;
END;
于 2010-02-17T20:23:24.173 に答える