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

¿Es posible pasar el nombre de la tabla como parámetro en Oracle?

¿Tiene varias tablas diferentes con exactamente los mismos nombres de columna y tipos de datos? Huele a diseño poco fiable.

De todos modos, no podemos usar variables como objetos de base de datos en SQL directo como ese. Tenemos que usar SQL dinámico.

PROCEDURE P_CUSTOMER_UPDATE
  (
      pADSLTable IN USER_TABLES.table_name%type,
      pAccountname IN NVARCHAR2,
      pStatus IN NUMBER,
      pNote IN NVARCHAR2,
      pEmail IN NVARCHAR2,
      pMobi IN NVARCHAR2,
      pServiceTypeID IN NUMBER,
      pDate IN DATE
  )
  IS
  BEGIN
      execute immediate 
          'UPDATE '||pADSLTable
          ||' SET STATUS = :1, NOTE = :2, EMAIL = :3, MOBI = :4, SERVICETYPE_ID = :5, ACTIVATION_DATE = :6'
          ||' WHERE ACCOUNT_NAME = :7'
      using pStatus, pNote, pEmail, pMobi, pServiceTypeID, pDate, pAccountname;
  END;

Una razón para evitar el uso de SQL dinámico es que está abierto al abuso. Las personas malintencionadas pueden usar los parámetros para intentar eludir nuestra seguridad. Esto se llama inyección SQL. Creo que la gente sobreestima la importancia de la inyección SQL. No es automáticamente una amenaza. Por ejemplo, si el procedimiento es un procedimiento privado en un paquete (es decir, no declarado en la especificación), es poco probable que alguien lo secuestre.

Pero es sensato tomar precauciones. DBMS_ASSERT es un paquete introducido en Oracle 10g para atrapar intentos de ataques de inyección SQL. En este caso, valdría la pena usarlo para validar el nombre de la tabla pasada

....
'UPDATE '|| DBMS_ASSERT.simple_sql_name(pADSLTable)
....  

Esto evitaría que alguien pase 'pay_table set salary = salary * 10 where id = 1234 --' como parámetro de nombre de tabla.

Otra razón para evitar SQL dinámico es que es más difícil hacerlo bien y más difícil de depurar. La sintaxis de la sentencia real solo se comprueba en tiempo de ejecución. Es bueno tener un conjunto completo de pruebas unitarias que validen todas las entradas aprobadas, para garantizar que el procedimiento no genere una excepción de sintaxis.

Finalmente, dicho SQL dinámico no aparece en vistas como ALL_DEPENDENCIES. Esto hace que sea más difícil realizar un análisis de impacto y localizar todos los programas que utilizan una tabla o columna determinada.