Oct 01 2009
By
Miguel | Filled under:
General
Hola de nuevo, el día de ayer me encontré con una situación bastante particular y como siempre sucede cuando no hay alguien a la mano para que colabore con el tema, me ha tocado ponerme a buscar un poco en la red, la cosa es tan sencilla como que necesité hacer un insert en una base de datos Oracle, pero no de la forma tradicional sino haciendo uso del método execute immediate.
He encontrado una sencilla forma, aunque solo funciona en Oracle 10 y superior, pero es una buena solución de rapidez.
Supongamos que necesitamos ejecutar una instrucción insert como la siguiente:
insert into empleados (id, name) values(1,‘Sysdent’);
Con un execute immediate nos quedaría así:
execute immediate ‘insert into empleados (id, name) values(1,’Sysdent‘)’;
Como podemos ver, la sentencia se nos vuelve inválida al encerrarla entre las comillas del execute immediate, debido a que la sentencia del comando debe ir entre las mismas comillas.
Una opción es poner las comillas (’) usando la función chr de oracle, que toma el código ascii y nos retorna el correspondiente caracter, así:
execute immediate ‘insert into empleados (id, name) values(1,’||chr(39)||‘Sysdent‘||chr(39)||‘)’;
Sin embargo esta es una solución un poco engorrosa, otra posible solución sería escapar las cadenas con la notación de oracle 10g, nos quedaría así:
execute immediate q’{insert into empleados (id, name) values(1,’Sysdent‘)}’;
Cuya sintaxis es:
q’[QUOTE_CHAR]Text[QUOTE_CHAR]‘
Donde QUOTE_CHAR es el carácter que usaremos para encerrar las cadenas de texto en nuestro caso fueron las llaves {}. Otro punto importante es que no usemos una carácter que esté contenido dentro de nuestras cadenas.
Fuente: Oracle FAQS>>