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

DBMS_SQLを使用してレコードを挿入するOracleDynamicSQLの例

    このチュートリアルでは、DBMS_SQLパッケージを使用してレコードを挿入するためのOracle動的SQLの例を示しています。

    動的SQLを使用すると、PL / SQLを使用してDMLおよびDDLステートメントを解析して実行し、Oracleデータベースで特定のタスクを実行できます。

    Oracle Dynamic SQLの例:DBMS_SQLを使用して新しいレコードを挿入する

    次のPL/SQLプロシージャは、HRスキーマのEMPLOYEES表に新しいレコードを挿入します。文字列変数「V_SQL」は挿入ステートメントに使用されるため、DBMS_SQLを使用して操作および解析できます。ストアード・プロシージャーは、DBMS_SQL.BIND_VARIABLEメソッドを使用してバインドするために使用される7つのパラメーターを受け入れます。また、ローカルでテストできるように、テーブルとシーケンスオブジェクトのスクリプトを提供します。

    従業員テーブルの作成

    CREATE TABLE EMPLOYEES
    (
       EMPLOYEE_ID      NUMBER (6),
       FIRST_NAME       VARCHAR2 (20 BYTE),
       LAST_NAME        VARCHAR2 (25 BYTE) NOT NULL,
       EMAIL            VARCHAR2 (25 BYTE) NOT NULL,
       PHONE_NUMBER     VARCHAR2 (20 BYTE),
       HIRE_DATE        DATE NOT NULL,
       JOB_ID           VARCHAR2 (10 BYTE) NOT NULL,
       SALARY           NUMBER (8, 2),
       COMMISSION_PCT   NUMBER (2, 2),
       MANAGER_ID       NUMBER (6),
       DEPARTMENT_ID    NUMBER (4)
    )
    /

    シーケンスオブジェクトを作成する

    CREATE SEQUENCE employee_seq
       START WITH 1
       INCREMENT BY 1
       ORDER
    /

    ストアドプロシージャの作成

    CREATE OR REPLACE PROCEDURE new_employee (i_FIRST    IN VARCHAR2,
                                              i_LAST     IN VARCHAR2,
                                              i_email    IN VARCHAR2,
                                              i_phone    IN VARCHAR2,
                                              i_hired    IN DATE,
                                              i_job      IN VARCHAR2,
                                              i_deptno   IN NUMBER DEFAULT 0)
    AS
       v_sql           VARCHAR2 (1000);
    
       cursor_var      NUMBER := DBMS_SQL.OPEN_CURSOR;
       rows_complete   NUMBER := 0;
       next_emp_id     NUMBER := employee_seq.NEXTVAL;
    BEGIN
       IF i_deptno != 0
       THEN
          v_sql :=
                'INSERT INTO EMPLOYEES ( '
             || 'employee_id, first_name, last_name, email, '
             || 'phone_number, hire_date, job_id, department_id) '
             || 'VALUES( '
             || ':next_emp_id, :first, :last, :email, :phone, :hired, '
             || ':job_id, :dept)';
       ELSE
          v_sql :=
                'INSERT INTO EMPLOYEES ( '
             || 'employee_id, first_name, last_name, email, '
             || 'phone_number, hire_date, job_id) '
             || 'VALUES( '
             || ':next_emp_id, :first, :last, :email, :phone, :hired, '
             || ':job_id)';
       END IF;
    
       DBMS_SQL.PARSE (cursor_var, v_sql, DBMS_SQL.NATIVE);
       DBMS_SQL.BIND_VARIABLE (cursor_var, ':next_emp_id', next_emp_id);
       DBMS_SQL.BIND_VARIABLE (cursor_var, ':first', i_FIRST);
       DBMS_SQL.BIND_VARIABLE (cursor_var, ':last', i_LAST);
       DBMS_SQL.BIND_VARIABLE (cursor_var, ':email', i_email);
       DBMS_SQL.BIND_VARIABLE (cursor_var, ':phone', i_phone);
    
       DBMS_SQL.BIND_VARIABLE (cursor_var, ':hired', i_hired);
    
       DBMS_SQL.BIND_VARIABLE (cursor_var, ':job_id', i_job);
    
       IF i_deptno != 0
       THEN
          DBMS_SQL.BIND_VARIABLE (cursor_var, ':dept', i_deptno);
       END IF;
    
       rows_complete := DBMS_SQL.EXECUTE (cursor_var);
       DBMS_SQL.CLOSE_CURSOR (cursor_var);
       COMMIT;
    END;
    /

    テスト

    DECLARE
       I_FIRST    VARCHAR2 (32767);
       I_LAST     VARCHAR2 (32767);
       I_EMAIL    VARCHAR2 (32767);
       I_PHONE    VARCHAR2 (32767);
       I_HIRED    DATE;
       I_JOB      VARCHAR2 (32767);
       I_DEPTNO   NUMBER;
    BEGIN
       I_FIRST := 'Kevin';
       I_LAST := 'John';
       I_EMAIL := '[email protected]';
       I_PHONE := '2299378';
       I_HIRED := SYSDATE;
       I_JOB := 'CLERK';
       I_DEPTNO := 10;
    
       NEW_EMPLOYEE (I_FIRST,
                            I_LAST,
                            I_EMAIL,
                            I_PHONE,
                            I_HIRED,
                            I_JOB,
                            I_DEPTNO);
    END;

    結果

    関連項目:

    • OracleにおけるSQLインジェクションの脆弱性とその防止を実証する例
    1. OracleでUnixタイムスタンプを日付値に変換する

    2. SQL Operations Studio(SQLOPS)とは何ですか?

    3. Oracleで先行ゼロを使用して数値をフォーマットする2つの方法

    4. SQLデータベースのテーブルの新しいレコードを監視します