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

バインド変数を使用してDMLを挿入します:即時ステートメントの実行の句を使用します

    バインド変数を使用してDMLを挿入する:なぜですか?

    追いかけましょう!バインド変数の2つの最大の利点は、SQLインジェクションに対するセキュリティと、ハード解析を減らすことによるパフォーマンスの向上です。これらの利点があるため、コードでバインド変数を使用することをお勧めするだけでなく、お勧めします。

    ネイティブ動的SQLでバインド変数を使用する方法を理解できれば、それは簡単なことではありませんか?あなたがそう疑問に思っているなら、私の親愛なる友人たち、あなたはこのブログでまさにそれをするつもりなので、あなたは正しい場所にいます。

    バインド変数とは何ですか?

    バインド変数は、SQL * Plusで作成し、PL/SQLで参照する変数として定義できます。さらに、ホスト環境のどこにでもBind変数を宣言できます。したがって、バインド変数はホスト変数とも呼ばれます。

    バインド変数の詳細については、PL/SQLチュートリアル6を参照してください。

    ネイティブ動的SQLでバインド変数を使用するにはどうすればよいですか?

    動的SQLでバインド変数を使用するには、「句の使用」を利用する必要があります。 」の「即時ステートメントの実行」。

    即時実行ステートメントの使用句とは何ですか?

    静的SQLでは、PL/SQLプログラムの実行後にバインド変数の値を指定する必要がありました。動的SQLでは、すべてのバインド変数の値を事前に指定する必要があります。 ExecuteImmediateを使用して動的に実行するSQLステートメントで使用されているものと同じもの。

    したがって、すべてのバインド変数の値を指定するには、ExecuteImmediateStatementのUSING句を使用します。 「USING」句を適用することにより、動的に実行するSQLステートメントで使用されるすべてのバインド変数のすべての値を一覧表示します。

    バインド変数とは何かを学習したので、即時実行ステートメントの句を使用して例を見てみましょう。

    句を使用して即時実行する例

    デモンストレーションでは、データをテーブルに挿入します。そのために、ExecuteImmediateステートメントを使用します。また、セキュリティとパフォーマンスを強化するために、InsertDMLでバインド変数を使用します。

    そのためには、最初にデータを挿入できるテーブルが必要になります。したがって、すぐに作成しましょう。そしていつものように、私は概念を簡単に理解できるようにコードをできるだけ単純に保ちます。

    ステップ1:テーブルを作成する

    CREATE TABLE stu_info(
        student_name    VARCHAR2 (20)
    );
    

    ステップ2:DMLステートメントを準備する

    すぐにexecuteを使用して実行したいSQLステートメントを事前に準備しておくことをお勧めします。このようにして、構文エラーの可能性を減らすことができます。

    Execute ImmediateのDMLを書き込むための制限は、DDLステートメントの場合と同じままです。 DDLステートメントと同様に、DMLステートメントはセミコロンで終了しないでください。したがって、それを念頭に置いて、INSERTステートメントを記述しましょう。

    INSERT INTO stu_info (student_name) VALUES (:stu_name)

    標準のINSERTDMLでは、通常、値の括弧句にデータを書き込みます。さらに、実行時に、このデータは対応する列に挿入されます。ただし、ご覧のとおり、ここでは、テーブルに挿入するための特定の値をハードコーディングする代わりに、バインド変数「:stu_name」を使用しています。

    ステップ3:PL/SQLコードを記述します

    サイクルの最後のステップは、ネイティブ動的SQLの即時ステートメントの実行のUSING句を適用して、バインド変数を使用してINSERTDMLを実行することです。

    SET SERVEROUTPUT ON;
    DECLARE
        sql_smt VARCHAR2 (150);
    BEGIN
        sql_smt :=  'INSERT INTO stu_info (student_name) VALUES (:stu_name)';
        EXECUTE IMMEDIATE sql_smt USING 'Steve';
    END;
    /
    

    このPL/SQLブロックの実行時に何が起こるかを理解しましょう。このプログラムを実行すると、PL / SQLエンジンはバインド変数:stu_nameの代わりにこの値「Steve」を使用してからINSERT DMLを実行し、この値を上記の表に挿入します。

    さらに、最後に上記のPL/SQLプログラムを作成する際に注意する必要のあることがいくつかあります。

    1. ExecuteImmediateを使用して実行するINSERTDMLまたはAnySQLステートメントは、必ず一重引用符で囲んでください。また、割り当てステートメント(5行目)とExecuteImmediateステートメントをセミコロンで終了することを忘れないでください。
    2. USING句を介してバインド変数に割り当てる値は、挿入先のテーブルの列のデータ型と同じか、互換性がある必要があります。たとえば、この例では、文字列である「Steve」という名前を、Varchar2データ型のstu_infoテーブルのstudent_name列に挿入しています。文字データ型はVarchar2データ型と非常に互換性があります。

    このプログラムを通じて、2つの非常に重要なことを学びました。

    1. 動的SQLの即時実行でINSERTDMLを使用する方法
    2. 動的に実行したいSQLクエリで使用されるバインド変数に値を割り当てるためにUSING句を適用する方法。

    さらに、「ORA-01008:すべての変数がバインドされていない」エラーの処理方法について説明したので、必ずビデオを確認してください。このエラーはOracleデータベース認定の観点から非常に重要であるため、このエラーの解決策を見逃したくないと思います。

    また、次のチュートリアルのように、Oracleデータベースで即時実行のUsing句を適用して複数のバインド変数を処理する方法を学習します。

    このブログから何か貴重なことを学んだことを願っています。その間、Facebook、Twitter、WhatsApp、または便利なメディアで友達と共有してください。また、私のYouTubeチャンネルに登録して、より迅速で興味深いチュートリアルを入手してください。ありがとう、そして素晴らしい一日を!


    1. メモリ内でのみPostgreSQLを実行する

    2. MySQL、MySQLi、PDOの違いは何ですか?

    3. CTEを使用して列の値を文字列に連結することは可能ですか?

    4. GiSTとGINインデックスの違い