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エラーがキャッチされて処理されたため、エラーメッセージは表示されず、テーブルは作成されませんでした。
テーブルがまだ存在していなかった場合は、テーブルが作成され、同じ出力が表示されます。