sql >> データベース >  >> RDS >> Oracle

OracleデータベースでINTO句を使用して即時実行を使用する方法

    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チャンネルに登録してください。

    ありがとう、そして素晴らしい一日を!


    1. SQL Server 2005で大文字と小文字を区別するように変更するにはどうすればよいですか?

    2. SQLServer用のMicrosoftOLEDBプロバイダーはTLS1.2をサポートしていますか

    3. データベーススナップショットのパフォーマンスを見る

    4. MariaDBのデータベースパフォーマンスチューニング