即時実行でテーブルDDLを作成
OracleDatabaseでNativeDynamicSQLのExecuteImmediateステートメントのCreatetableDDLクエリを作成する方法は2つあります。前回のチュートリアルでは、そのうちの1つについてすでに説明しました。前のチュートリアルで説明した最初の方法は、おそらく動的SQLのSQLクエリを作成する最も簡単な方法です。しかし、それは私たちがさらに学ぶことを妨げるものではありません。それでは、先に進んで2番目の方法を学びましょう。
したがって、このチュートリアルでは、ExecuteImmediateステートメントを使用して動的実行用のCREATETABLEDDLを作成する2番目の方法を学習します。
このチュートリアルは前のチュートリアルの続きであるため、理解を深めるために、最初にそのブログを読んでください。そうは言っても、チュートリアルを始めましょう。
ステップ1:CREATETABLEDDLを準備します。
動的に実行するSQLクエリを事前に準備します。これにより、コードの混乱が減り、構文エラーも最小限に抑えられます。
CREATE TABLE tut_83 ( tut_num NUMBER(5), tut_name VARCHAR2 (50), CONSTRAINT cons1_col1_pid_pk PRIMARY KEY (tut_num) )
これがCREATETABLEDDLです。名前の変更と主キーの制約の追加を除けば、このDDLは前回のチュートリアルで作成したものとほとんど同じです。
ステップ2:DDLステートメントを動的に実行するためのPL/SQLブロックを記述します。
これで、CREATETABLEDDLが準備されました。動的に実行するためのPL/SQLプログラムを作成しましょう。
SET SERVEROUTPUT ON; DECLARE ddl_qry VARCHAR2(150); BEGIN ddl_qry := 'CREATE TABLE tut_83('|| 'tut_num NUMBER(3),'|| 'tut_name VARCHAR2(50)'|| ')'; EXECUTE IMMEDIATE ddl_qry; END; /
このプログラムで何をしたか見てみましょう。
宣言セクション 。
DECLARE ddl_qry VARCHAR2 (150);
PL / SQLブロックの宣言セクションで、ddl_qryという名前の変数を宣言しました。この変数は、ExecuteImmediateステートメントを使用して実行するCREATETABLEDDLを保持します。
最後のチュートリアルのように、Execute Immediateは、すべてのSQLステートメントをVARCHAR2データ型の文字列として扱います。そのため、変数ddl_qryをVARCHAR2データ型として宣言しました。
実行セクション。
宣言セクションの直後に、すべての楽しみが起こっている実行セクションがあります。
BEGIN ddl_qry := 'CREATE TABLE tut_83 ('|| 'tut_num NUMBER (5),'|| 'tut_name VARCHAR2 (50),'|| 'CONSTRAINT cons1_col1_pk PRIMARY KEY (tut_num)'|| ')'; EXECUTE IMMEDIATE ddl_qry; END; /
この実行セクションは、次の2つのステートメントのみで構成されています。
- 割り当てステートメント
- 即時ステートメントを実行する
「代入ステートメント」である最初のステートメントは、このコードを前のコードとは異なります。これらのステートメントが何であるかを見てみましょう。
ステートメント1:割り当てステートメント。
ddl_qry := 'CREATE TABLE tut_83 ('|| 'tut_num NUMBER (5),'|| 'tut_name VARCHAR2 (50),'|| 'CONSTRAINT cons1_col1_pk PRIMARY KEY (tut_num)'|| ')';
これは、このPL/SQLプログラムを前のチュートリアルで見たものとは異なるものにしている唯一のステートメントです。
このステートメントでは、CREATETABLEDDLを変数ddl_qryに割り当てています。では、ここで何が違うのですか?
前の方法では、DDLステートメント全体を1組の引用符(‘’)で囲みました。このように
ddl_qry:= 'CREATE TABLE tut_82 ( tut_num NUMBER(3), tut_name VARCHAR2 (50) )';
DDLクエリを作成する最初の方法
一方、2番目の方法では、クエリ全体を一重引用符で囲む代わりに、最初にVARCHAR2の複数の文字列に分割しました。これは、クエリのすべての行を一重引用符で囲むことによって行いました。その後、連結演算子(||)を使用してそれらすべてを結合し、PL/SQLエンジンがそれらを単一のユニットとして実行するようにしました。
ビデオチュートリアルで、動的実行のためのこのブレークアンドコンカーアプローチの詳細なデモンストレーションを見ることができます。
推奨読書:Concat関数とConcat演算子。
ステートメント2:即時ステートメントを実行します。
2番目のステートメントはExecuteImmediateステートメントです。結果の単一行を動的に返すSQLステートメントを実行します。この場合、この文はPL/SQLブロックを介してCREATETABLEDDLクエリを実行しています。
OracleDatabaseのPL/SQLブロックを介してDDLステートメントを実行する方法は2つだけです。 DBMS_SQLパッケージを使用するか、ネイティブ動的SQLの即時実行を使用します。 ExecuteImmediateを使用して他に何ができるかを知るためにここを読んでください。
DDLを動的に実行するには、最初に予約済みのフレーズ「ExecuteImmediate」を記述する必要があります。上記のように、DDLを保存した変数名が続きます。
テーブルが作成されているかどうかを確認します。
PL/SQLブロックがCREATETABLEDDLを正常に実行したかどうかをチェックする方法は複数あります。しかし、ここでは、最も簡単で人気のある2つの方法を紹介します。
DESCRIBEコマンドの使用
PL / SQLブロックが表tut_83を正常に作成したかどうかを確認する最も簡単な方法は、DESCRIBEコマンドを使用することです。 describeコマンドは、上記のテーブルの構造を表示します。存在する場合にのみ、それ以外の場合はエラーを返します。
それを試してみましょう
DESCRIBE tut_83; Or DESC tut_83
上記のdescribeコマンドの実行時に表tut_83の構造が表示された場合は、上記のPL/SQLブロックが表を正常に作成したことを意味します。ただし、エラーが発生した場合は、どこかで混乱し、PL/SQLブロックの実行が成功しません。
ALL_OBJECTSデータディクショナリを使用します。
ALL_OBJECTSデータディクショナリをクエリすることもできます。これは、目的のテーブルまたは作成しようとしている他のオブジェクトが作成されているかどうかを確認するのに役立ちます。このように
SELECT 'We created a table with name '||object_name||' in ' ||owner||' schema on '||created FROM all_objects WHERE object_name ='TUT_83';のスキーマ
これらは、目的のオブジェクトが正常に作成されたかどうかを確認するための多くの方法のうちの2つです。
このチュートリアルを終了する前に、もう1つ。これと今後のチュートリアルをよりよく理解するために、前のブログを読んでください。
これは、Oracleデータベースでネイティブ動的SQLの即時ステートメントを実行するためのCREATETABLEDDLを作成する2番目の方法に関するPL/SQLチュートリアルです。
あなたが読書を楽しんだことを願っています。必ずYouTubeチャンネルに登録してください。次のチュートリアルでは、スキーマオブジェクトを動的に削除および変更する方法を学習するためです。
ありがとう、そして素晴らしい一日を!