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

OracleデータベースでEXECUTEIMMEDIATEを使用してCreateTableDDLを実行する方法

    即時実行でテーブルDDLを作成

    CREATE TABLE DDLを実行する際の問題は何であるかを考えている必要がありますか?そうです、SQLで実行している限り問題はありません。しかし、PL / SQLを使用してそれらを実行することになると、それはちょっと難しいです。

    まず、OracleデータベースのDDLステートメントとは何ですか?

    DDLはデータ定義言語の略です。 DDLステートメントを使用して、データベースオブジェクトとスキーマを作成または変更できます。これらのステートメントは次のとおりです。

    • 作成
    • ドロップおよび
    • ALTER。

    スキーマとオブジェクトを事前にレイアウトし、プロジェクトの初期段階で作成することをお勧めします。可能であれば、SQLを使用してこの作業を行う必要があります。それははるかに速く、はるかにクリーンになる可能性があります。ただし、常に可能であるとは限りません。そのような状況では、OracleDatabaseのNativeDynamicSQLなどの機能を利用できます。

    ネイティブ動的SQLを使用すると、PL/SQLを介してDDLやDMLなどのSQLステートメントを実行できます。

    PL / SQLプログラムを介してDDLを実行できないのはなぜですか?

    PL / SQLを使用したDDL文の実行がそれほど複雑かどうかまだ疑問がある場合は、PL/SQLプログラムを使用して表を作成してみましょう。

    SET SERVEROUTPUT ON;
    BEGIN 
        CREATE TABLE tut_82 (
        tut_num NUMBER(3),
        tut_name   VARCHAR2 (50));  
    END;
    /
    

    PL / SQLプログラムを使用して表を作成するように依頼した場合、このアプローチが最初に考えられたと思います。つまり、これは完璧に見えますが、何がうまくいかない可能性がありますか?

    このプログラムに問題はありません。ここでの唯一の問題は、PL/SQLがDDLステートメントを直接サポートしていないことです。 PL / SQLを使用してDDLステートメントを実行するには、DBMS_SQLパッケージを使用するか、NATIVEDYNAMICSQLの高度で改善された方法を使用する必要があります。

    これを自分でチェックすることができます。上記のプログラムを実行してください。実行すると、次の図に示すようなエラーが発生します。

    では、PL / SQLプログラムを介してDDLを実行する適切な方法は何ですか?

    DDLは、DBMS_SQLパッケージを使用するか、Native DynamicSQLのExecuteImmediateステートメントを使用して、PL/SQLプログラムを介して実行できます。後者のオプションは最もよく使用されるオプションであり、特にパフォーマンスが向上し、構文を習得しやすいため、今日では特にそうです。

    Oracleデータベースで即時実行を使用してCREATETABLEDDLを実行するにはどうすればよいですか?

    ステップ1:事前にDDLを準備します。

    必須ではありませんが、事前にDDLを準備しておくことをお勧めします。そうすれば、少なくともDDLステートメントの構文が原因で構文エラーが発生する可能性を排除できます。

    この例では、CREATE TABLE DDLを実行したいので、最初にテーブルを作成するためのDDLを記述しましょう。

    CREATE TABLE tut_82 (
        tut_num    NUMBER (3),
        tut_name   VARCHAR2 (50)
    ) 
    

    このDDLステートメントは、NUMBERデータ型のtut_numとVARCHAR2データ型のtut_nameの2つの列を持つtut_82という名前のテーブルを作成します。

    ここで注意してください。SQLステートメント(EXECUTE IMMEDIATEで実行するステートメント)をセミコロンで終了しないでください。

    ステップ2:ExecuteImmediateを使用してPL/SQLプログラムを介してDDLを実行します。

    次にDDLを準備したら、PL/SQLプログラムを作成する必要があります。

    SET SERVEROUTPUT ON;
    DECLARE
        ddl_qry     VARCHAR2 (150);
    BEGIN
        ddl_qry := 'CREATE TABLE tut_82(
                    tut_num     NUMBER(3),
                    tut_name    VARCHAR2(50)
                    )';
        EXECUTE IMMEDIATE ddl_qry;
    END;
    /
    

    上記のPL/SQLブロックでは、ddl_qryという名前の変数を宣言しました。この変数を使用して、手順1で準備したDDLステートメントを保持しました。

    情報:
    ここで確認する必要があるのは、EXECUTEIMMEDIATEステートメントで実行するSQLステートメントを保持するために使用する変数が常にVARCHAR2データ型である必要がある> 十分なデータ幅があります DDLが簡単に収まるようにします。

    このPL/SQLブロックの実行セクションには、2つの実行可能ステートメントがあります。これらのステートメントは次のとおりです。

    ステートメント1:割り当てステートメント

    最初の文では、代入演算子を使用してCreate Table DDLを変数ddl_qryに格納しました(PL / SQLでは、代入演算子はコロンと等号の組み合わせです)。

    ステートメント2:MightyExecuteImmediateステートメント

    2番目のステートメントはExecuteステートメントです。 DDLを動的に実行するには、最初に予約済みのフレーズ「Execute Immediate」を記述し、その後に上記のようにDDLを格納した変数名を記述する必要があります。

    必要に応じて、「予約済みフレーズ」というフレーズの直後にDDLを書き込むこともできます。それは完全に個人的な選択です。 DDLを保持するためにVariableを使用する前者のアプローチを使用するのが好きです。これは、まず、コードがすっきりときれいに見えるようになり、さらにエラートレースが非常に簡単になるためです。

    しかし、マニッシュ、DDLステートメントを書く別の方法も学びたいです。

    確かに、何か新しいことを学ぶことに何の問題もありません。

    BEGIN
        EXECUTE IMMEDIATE 'CREATE TABLE tut_82(
                    	tut_num     NUMBER(3),
                    	tut_name    VARCHAR2(50)
                    )';
    END;
    /
    

    上記のコードの代替アプローチは、ExecuteImmediateステートメント内にDDLステートメントを直接記述することです。このためには、最初に予約済みのフレーズExecute Immediateを記述し、次に動的に実行するDDLステートメントを記述する必要があります。

    どちらの方法でも、即時実行用のDDLを作成する際に、いくつかの点に注意する必要があります。

    最初:SQLステートメントを常に一重引用符のペアで囲みます

    Execute Immediateは、動的に実行するDDLやDML、またはその他のサポートされているSQLステートメントをVARCHAR2データ型の文字列として扱うことを常に忘れないでください。 PL / SQLでは、任意の文字またはVARCHAR2文字列を一重引用符のペアで囲みます。したがって、ExecuteImmediateを使用して実行するSQLステートメントを必ず一重引用符のペアで囲んでください。

    2番目:セミコロンの世話をします。

    Execute ImmediateのSQLステートメントを作成する場合は、SQLステートメントを囲んだ一重引用符のすぐ外側にセミコロン(;)を付ける必要があります。一方、ExecuteImmediateを使用して動的実行用のPL/ SQLブロックを作成している場合は、PL / SQLブロックの最後に、終了一重引用符の直前と終了一重引用符のすぐ外側にセミコロンを配置する必要があります。

    これは、Oracleデータベースでネイティブ動的SQLのEXECUTEIMMEDIATEステートメントを使用してCreateTableDDLステートメントを実行する方法に関する詳細なチュートリアルです。あなたがそれを楽しんで、何か新しいことを学んだことを願っています。

    次のチュートリアルでダイナミックSQLについて新しくて興味深いことを学ぶので、必ず私のYouTubeチャンネルを購読してください。 TwitterやFacebookでフォローすることもできます。

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


    1. SQLServer2005のアトミックUPSERT

    2. PostgreSQLバルクデータロードの7つのベストプラクティスのヒント

    3. PHPMyAdminを使用してユーザー'root'@'localhost'のアクセスが拒否されました

    4. Debian10に最新のMySQL8をインストールする方法