sql >> Base de Datos >  >> RDS >> Oracle

Ejemplo de SQL dinámico de Oracle para insertar un registro mediante DBMS_SQL

En este tutorial, doy un ejemplo de SQL dinámico de Oracle para insertar un registro utilizando el paquete DBMS_SQL.

A través de SQL dinámico, puede analizar cualquier declaración DML y DDL usando PL/SQL para ejecutar una tarea particular en Oracle Database.

Ejemplo de SQL dinámico de Oracle:insertar un nuevo registro utilizando DBMS_SQL

El siguiente procedimiento PL/SQL insertará un nuevo registro en la tabla EMPLOYEES del esquema HR. Se usa una variable de cadena "V_SQL" para la declaración de inserción, de modo que pueda manipularse y analizarse usando DBMS_SQL. El procedimiento almacenado acepta siete parámetros que se utilizarán para enlazar utilizando el método DBMS_SQL.BIND_VARIABLE. También proporciona la secuencia de comandos para la tabla y el objeto de secuencia para que pueda probar localmente.

Crear tabla EMPLEADOS

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)
)
/

Crear un objeto de secuencia

CREATE SEQUENCE employee_seq
   START WITH 1
   INCREMENT BY 1
   ORDER
/

Crear procedimiento almacenado

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;
/

Prueba

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;

Resultado

Véase también:

  • Un ejemplo para demostrar la vulnerabilidad de la inyección SQL y su prevención en Oracle