Oracle Databaseには、IF NOT EXISTSは含まれていません CREATE TABLEを含む句 他のDBMSと同様に、ステートメント。
したがって、テーブル名がすでに使用されているためにエラーを発生させたくない場合は、他の方法を使用してテーブルの存在を確認する必要があります。
オプション1:DBA_TABLESを確認します 表示
DBA_TABLES データベース内のすべてのリレーショナルテーブルを説明するデータディクショナリビューです。その列はALL_TABLESの列と同じです 。
このテーブルをチェックして、テーブルがすでに存在するかどうかを確認してから、CREATE TABLEのみを実行できます。 まだ存在しない場合はステートメント。
例:
DECLARE
tbl_count number;
sql_stmt long;
BEGIN
SELECT COUNT(*) INTO tbl_count
FROM dba_tables
WHERE owner = 'HR'
AND table_name = 'T1';
IF(tbl_count <= 0)
THEN
sql_stmt:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
END IF;
END; 結果:
PL/SQL procedure successfully completed.
この場合、t1という名前の既存のテーブルがないため、テーブルが作成されました。 。
ここで、テーブルを再度作成しようとすると、PL / SQLプロシージャが正常に完了したのと同じ出力が得られ、エラーは発生しません。
ただし、最初にテーブルの存在を確認せずにテーブルを作成しようとすると、エラーが発生します。
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
); 結果:
Error report - ORA-00955: name is already used by an existing object 00955. 00000 - "name is already used by an existing object"
オプション2:エラーをテストする
これを行う別の方法は、単に先に進んでCREATE TABLEを実行することです。 ステートメントを実行し、発生したORA-00955エラーをキャッチします。具体的には、発生したSQLCODE-955エラーをキャッチします。
例:
DECLARE
sql_stmt long;
BEGIN
sql_stmt:='
CREATE TABLE T1 (
c1 number(6,0),
c2 varchar2(10)
)';
EXECUTE IMMEDIATE sql_stmt;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -955 THEN
NULL;
ELSE
RAISE;
END IF;
END; 結果:
PL/SQL procedure successfully completed.
T1なのに、それを実行しました テーブルはすでに存在していました。 ORA-00955エラーがキャッチされて処理されたため、エラーメッセージは表示されず、テーブルは作成されませんでした。
テーブルがまだ存在していなかった場合は、テーブルが作成され、同じ出力が表示されます。