INTO句を使用して即時実行
ネイティブ動的SQLまたはNDSは、柔軟性を提供し、パフォーマンスを向上させ、プログラミング構文を簡素化することにより、開発者を支援します。今日、このチュートリアルでは、ExecuteImmediateStatementを使用してOracleDatabaseで動的SQLクエリを作成する方法を学習します。
では、OracleDatabaseのExecuteImmediateステートメントとは何ですか。
Execute Immediateを使用すると、OracleDatabaseで任意のSQL文またはPL/SQLブロックを動的に解析および実行できます。そして動的とは、実行時を意味します。
即時実行は1つの引数のみを取ります。これは、SQL文またはPL/SQLブロックのいずれかです。コンパイラは、ExecuteImmediateステートメントの引数をVARCHAR2データ型の文字列として扱います。したがって、SQLクエリまたはPL / SQLブロックを一重引用符(‘’)のペアで囲むようにしてください。
Execute ImmediateでSQLステートメントを使用できますか?
1行の結果を返すSQL文またはPL/SQLブロックは、ExecuteImmediateで使用できます。さらに、ステートメントが複数行の結果を返す場合は、他の方法があります。さらに、これらについては今後のチュートリアルで説明します。
Execute Immediate Statementの構文は何ですか?
ExecuteImmediateステートメントの構文は非常に単純です。見てみましょう。
EXECUTE IMMEDIATE dynamic_query [INTO user_defined_variable-1, user_defined_variable-2…] [USING bind_argument-1, bind_argument-2…] [RETURNING|RETURN-INTO clause];
場所:
即時実行 :ExecuteImmediateは予約済みのフレーズです。
Dynamic_query :予約されたフレーズの後に、動的クエリを作成する必要があります。このクエリは、SQL文またはPL/SQLブロックである可能性があります。さらに、コンパイラは動的クエリをVARCHAR2データ型の文字列として扱います。したがって、クエリを一重引用符のペアで囲むようにする必要があります。
INTO句 :INTO句を使用して、ユーザー定義変数のリストを指定します。さらに、これらは動的SELECTステートメントによって返される値を保持します。これは、SELECT-INTOステートメントと非常によく似ています。また、これはオプションの句なので、必要ない場合は省略できます。
USING句 :動的クエリでバインド変数を使用した場合、この句を使用すると、そのバインド変数の値を指定できます。これらは、実行時にそれに応じて置き換えられます。繰り返しますが、これはオプションの句です。
戻る または戻る 句:Return into句は、USING句の反対です。 using句では、ここでRETURNING INTO句で動的クエリに値を提供しますが、動的クエリによって返される値を取得します。そして、それらをバインド引数の指定されたリストに格納します。繰り返しますが、これはオプションの条項です。
上記の構文の詳細な説明は、対応するビデオでご覧いただけます。
即時実行ステートメントの例。
上記のすべての句を使用してすぐに実行のデモンストレーションを行うと、複雑さが増し、例が理解しにくくなります。これは私たちが望んでいることとは正反対です。
したがって、概念を単純で習得しやすいものにするために、INTOである最初の句を使用して即時実行の例を実行します。
INTO句を使用して即時実行します。
SET SERVEROUTPUT ON; DECLARE sql_qry VARCHAR2 (150); emp_tot NUMBER(3); BEGIN sql_qry:= ‘SELECT count (*) FROM employees'; EXECUTE IMMEDIATE sql_qry INTO emp_tot; DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot); END; /
これは、 INTOで即時実行を使用する方法を示す非常に簡単な例です。 OracleDatabaseの句。ここで何をしたか見てみましょう。
宣言セクション
宣言セクションでは、2つの変数を宣言しました。最初の変数は、VARCHAR2タイプのsql_qryです。この変数を使用して、EXECUTEIMMEDIATEステートメントで実行するSELECTステートメントを格納します。この変数はDMLステートメントを保持するため、十分なデータ幅があることを確認する必要があります。
2つ目は、ユーザー定義の変数emp_totです。この変数をINTO句とともに使用して、SELECTステートメントによって返されるデータを保持します。
実行セクション
このセクションには、3つのステートメントしかありません。これらは次のとおりです。
ステートメント 1 :
最初のステートメントでは、有効なSQLクエリを変数sql_qryに割り当てています。
ステートメント 2 :
2番目のステートメントは、EXECUTE IMMEDIATE –INTOステートメントです。このステートメントでは、予約されたフレーズを書き込んだ直後に、すぐに実行し、変数sql_qryの名前を書き込みます。 SELECTステートメントを格納するのと同じ変数。
実行時に、ランタイムエンジンは、この変数を保持しているコンテンツ(この場合はSELECTステートメント)に置き換えます。エラーがない場合、ランタイムエンジンは基礎となるSELECTステートメントを実行します。その後、結果があればそれを返します。
一方、SELECTステートメントは、employeesテーブルの行の総数である値を返します。 EXECUTE IMMEDIATEステートメントのINTO句を使用して、その戻り値を変数emp_totに格納します。
ステートメント 3 :
3番目のステートメントは、emp_tot変数の値をユーザーに表示するための出力ステートメントです。
情報:
DMLトランザクションの場合、Execute ImmediateはDMLトランザクションを自動的にコミットしないため、明示的なコミットが必要です。
この実行セクションを作成する別の方法は次のとおりです。
BEGIN EXECUTE IMMEDIATE 'SELECT count (*) FROM employees' INTO emp_tot; DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot); END; /
必要に応じて、最初のステートメントを完全にスキップできます。予約フレーズEXECUTEIMMEDIATEの直後にSQLクエリを記述します。
YouTubeチャンネルの動画を見て、[即時実行]のクエリを作成する適切な方法を確認してください。
皆さんはどう思いますか?
個人的には、クエリを格納するために変数を使用した前者の方法が好きです。その後、その変数をExecuteImmediateで使用しました。これにより、コードがすっきりときれいに見えるようになります。さらに、クエリを変更または修正したい場合に備えて、クエリを追跡するのに役立ちます。
皆さんはどう思いますか? Execute Immediateのどの書き方が一番好きですか?前者または後者。私のFacebookページまたは私のTwitterであなたの意見を教えてください。
ビデオを見ながら学ぶのがとても便利だと思ったら、私のYouTubeチャンネルでビデオを見ることができます。そして、INTO句を使用して即時実行について学びます。
このチュートリアルのこれまでのところ、Execute Immediate Statementとは何か、およびOracleDatabaseのINTO句を使用してSQLクエリを動的に実行するために同じステートメントを使用する方法を学習しました。このチュートリアルではこれで十分だと思います。それ以上伸ばさないようにして、シンプルにしましょう。
さらに興味深いチュートリアルについては、必ず私のYouTubeチャンネルに登録してください。
ありがとう、そして素晴らしい一日を!