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

Oracle PL / SQL:即時実行を使用した動的SQLの例

    このチュートリアルでは、EXECUTEIMMEDIATEステートメントを使用して動的SQLを示すOraclePL/SQLプログラムの例を示します。

    Oracle PL / SQLEXECUTEIMMEDIATE動的SQLの例

    次のPL/SQLプロシージャは、値が実際の値と異なる場合、従業員IDのEmployeesテーブルのレコードを更新します。

    Updateステートメントは、文字列を使用して動的に準備され、EXECUTEIMMEDIATEステートメントを使用して実行されます。 SQLステートメントは、渡された新しい値を持つパラメーターに対してのみ作成されます。

    たとえば、従業員のfirst_nameとsalaryを更新する場合は、パラメーターi_id、first_name、およびi_salaryの値を渡すと、restパラメーターをnullにすることができます。更新ステートメントは、これらの列に対してのみ生成されます。

    CREATE OR REPLACE PROCEDURE update_emp_rec (
       i_id               IN employees.employee_id%TYPE,
       i_first            IN employees.first_name%TYPE,
       i_last             IN employees.last_name%TYPE,
       i_email            IN employees.email%TYPE,
       i_phone            IN employees.phone_number%TYPE,
       i_job              IN employees.job_id%TYPE,
       i_salary           IN employees.salary%TYPE,
       i_commission_pct   IN employees.commission_pct%TYPE,
       i_manager_id       IN employees.manager_id%TYPE,
       i_department_id    IN employees.department_id%TYPE)
    AS
       emp_upd_rec   employees%ROWTYPE;
    
       sql_string    VARCHAR2 (1000);
    
       set_count     NUMBER := 0;
    BEGIN
       SELECT *
         INTO emp_upd_rec
         FROM employees
        WHERE employee_id = i_id;
    
       sql_string := 'UPDATE EMPLOYEES SET ';
    
       IF i_first != emp_upd_rec.first_name
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', FIRST_NAME =''' || i_first || '''';
          ELSE
             sql_string := sql_string || ' FIRST_NAME =''' || i_first || '''';
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF i_last != emp_upd_rec.last_name
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', LAST_NAME =''' || i_last || '''';
          ELSE
             sql_string := sql_string || ' LAST_NAME =''' || i_last || '''';
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF UPPER (i_email) != emp_upd_rec.email
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', EMAIL =''' || UPPER (i_email) || '''';
          ELSE
             sql_string := sql_string || ' EMAIL =''' || UPPER (i_email) || '''';
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF UPPER (i_phone) != emp_upd_rec.phone_number
       THEN
          IF set_count > 0
          THEN
             sql_string :=
                sql_string || ', PHONE_NUMBER =''' || UPPER (i_phone) || '''';
          ELSE
             sql_string :=
                sql_string || ' PHONE_NUMBER =''' || UPPER (i_phone) || '''';
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF i_job != emp_upd_rec.job_id
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', JOB_ID =''' || i_job || '''';
          ELSE
             sql_string := sql_string || ' JOB_ID =''' || i_job || '''';
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF i_salary != emp_upd_rec.salary
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', SALARY =' || i_salary;
          ELSE
             sql_string := sql_string || ' SALARY =' || i_salary;
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF i_commission_pct != emp_upd_rec.commission_pct
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', COMMISSION_PCT =' || i_commission_pct;
          ELSE
             sql_string := sql_string || ' COMMISSION_PCT =' || i_commission_pct;
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF i_manager_id != emp_upd_rec.manager_id
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', MANAGER_ID =' || i_manager_id;
          ELSE
             sql_string := sql_string || ' MANAGER_ID =' || i_manager_id;
             set_count := set_count + 1;
          END IF;
       END IF;
    
       IF i_department_id != emp_upd_rec.department_id
       THEN
          IF set_count > 0
          THEN
             sql_string := sql_string || ', DEPARTMENT_ID =' || i_department_id;
          ELSE
             sql_string := sql_string || ' DEPARTMENT_ID =' || i_department_id;
             set_count := set_count + 1;
          END IF;
       END IF;
    
       sql_string := sql_string || ' WHERE employee_id = ' || i_id;
    
       IF set_count > 0
       THEN
          DBMS_OUTPUT.put_Line (sql_string);
    
          EXECUTE IMMEDIATE sql_string;
       ELSE
          DBMS_OUTPUT.PUT_LINE (
             'No update needed, ' || 'all fields match original values');
       END IF;
    EXCEPTION
       WHEN NO_DATA_FOUND
       THEN
          DBMS_OUTPUT.PUT_LINE ('No matching employee found');
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.PUT_LINE(   'Data entry error has occurred, '
                               || 'please check values and try again'
                               || sql_string);
    END;
    /

    プロシージャを実行する

    以下は、PL / SQLコードであり、上記の手順を実行して、従業員ID199のfirst_nameと給与を更新します。

    SET SERVEROUTPUT ON;
    
    DECLARE
       I_ID               NUMBER;
       I_FIRST            VARCHAR2 (20);
       I_LAST             VARCHAR2 (25);
       I_EMAIL            VARCHAR2 (25);
       I_PHONE            VARCHAR2 (20);
       I_JOB              VARCHAR2 (10);
       I_SALARY           NUMBER;
       I_COMMISSION_PCT   NUMBER;
       I_MANAGER_ID       NUMBER;
       I_DEPARTMENT_ID    NUMBER;
    BEGIN
       I_ID := 199;
       I_FIRST := 'Joseph';
       I_LAST := NULL;
       I_EMAIL := NULL;
       I_PHONE := NULL;
       I_JOB := NULL;
       I_SALARY := 3099;
       I_COMMISSION_PCT := NULL;
       I_MANAGER_ID := NULL;
       I_DEPARTMENT_ID := NULL;
    
       UPDATE_EMP_REC (I_ID,
                       I_FIRST,
                       I_LAST,
                       I_EMAIL,
                       I_PHONE,
                       I_JOB,
                       I_SALARY,
                       I_COMMISSION_PCT,
                       I_MANAGER_ID,
                       I_DEPARTMENT_ID);
       COMMIT;
    END;
    /

    出力

    UPDATE EMPLOYEES SET FIRST_NAME ='Joseph', SALARY =3099 WHERE employee_id = 199
    PL/SQL procedure successfully completed.

    関連項目:

    • Oracleプロシージャでテーブルを切り捨てる方法
    • DBMS_SQLを使用してレコードを挿入するOracleDynamicSQLの例
    • PL / SQLでループを使用せずに1から10を印刷するにはどうすればよいですか?
    1. PostgreSQLの行ごとに1回だけ遅延トリガーを実行します

    2. ユーザーごとに最新の日付の行を選択します

    3. utf8とlatin1の違い

    4. クラスタ化された列ストアインデックスからの削除のシリアル化