Category: Sql*Plus
Las famosas comillas, para escribir una comilla ….. ahorratelas!!
Quien alguna vez no lucho con las comillas dentro de Sql Dinámicos para poder mostrar una comilla
Algo complicado, engorroso y dificultoso.

Claro, era el típico caso de que dentro de una instrucción debiamos colocar como trescientas comillas para que apareciera una , que entretenido!!!
Por ejemplo si queríamos una consulta dinámica , que nos desplegará un where con una literal , debiamos escribir algo así
Ejemplo :
var_sql := 'update '|| var_tabla ||' set campo1 = '||'valor literal';
Oviamente la sentencia anterior nos arrojaría error , pues en la transformación de la sentencia el CBO la asumiría como
Siendo var_tabla = TAB_PAGOS y 'valor literal' = ADF4561;
SQL> r
1 declare
2 var_sql varchar2(1000);
3 var_tabla varchar2(1000) := 'TABLA1';
4 begin
5 var_sql := 'update '||var_tabla||' set campo1 = '||'ADFR5141';
6 dbms_output.put_line(var_sql);
7* end;update TABLA1 set campo1 = ADFR5141 –> Está sentenciada error si es ejecutada
PL/SQL procedure successfully completed.
SQL>
Por ende hay un error y se debiesen generar las comillas para su visualización
var_sql := 'update '|| var_tabla ||' set campo1 = '||''||'valor literal'||'';
SQL> r
1 declare
2 var_sql varchar2(1000);
3 var_tabla varchar2(1000) := 'TABLA1';
4 begin
5 var_sql := 'update '||var_tabla||' set campo1 = '||''||'ADFR5141'||''';
6 dbms_output.put_line(var_sql);
7* end;
update TABLA1 set campo1 = 'ADFR5141'; –> Funcionaría sin inconvenientes
Por lo que se ve es demasiado engorroso, ahora imaginanse coloca un formato de fecha dentro de ese enredo , con un to_char , ¿se enredaría mas cierto?
Pues bien, esto se soluciona en gran medida en Oracle10g, con una utilidad genial ,simplemente todo queda inscrito dentro de q'[…..]'
Inclusive, todo puede quedar inscrito dentro de cualquiera de estos símbolos
!
[ ]
{ }
( )
< >
O sea, nuestro pequeño update dinámico quedaría
var_sql := 'update '|| var_tabla ||' set campo1 = q'[ 'valor literal' ]';
Acaso no se ve más sencillo , mmmmm , claro que sí !!!!
![]()
![]()
17.05.10. 14:33:15. 329 words, 2217 views. Categories: Sql*Plus , Leave a comment » • Send a trackback »
Como crear ROLES de consulta sobre toda la base de datos, de forma fácil
La pregunta es la siguiente
".. Necesito generar un usuario que sea de sólo lectura para toda mi base de datos .."
Pues bien , eso se puede hacer con el siguiente script
click en el LINK

, los pasos para llevarlo a cabo
1.- Copiar el archivo a una ruta fácil de repetir
, no colocar en Documents and Settings, etc ..etc ..etc 
2.- Ejecutar el archivo de la forma
sqlplus usuario/password@string_conexion @archivo.sql
3.- En el script va a aparecer una consulta con respecto al nombre del usuario
Ingrese usuario a crear con solo roles de lectura :
4.- Además aparece una pregunta si es VoC ,
V = Implica que se mostrará el comando (Visualizar)
C = Implica que se ejecutará el comando (Crear)
Desea visualizar o crear (V o C)? :
5.- Con lo anterior se crearán roles con el prefijo ROLSER_nombre_de_esquema
6.- Se creará el usuario con grant de connect y se le asignarán todos los roles generados
En resumidas cuentas, un comando , para esa ingrata tarea ... de enrolar
Espero les sirva
![]()
![]()
26.01.10. 14:00:00. 180 words, 5884 views. Categories: Base de datos, SQL / Programación, Cosas varias, Sql*Plus , Leave a comment » • Send a trackback »
Sql*Plus : Como conectarse a una base de datos con problema (opción _prelim de Sql*Plus)
A veces queremos conectarnos a una instancia Oracle, y lo hacemos , como no, con el usuario más poderoso que existe, con SYS como SYSDBA, pero ni eso resulta y simplemente no podemos conectarnos
Pues bien , para esos momentos de desdicha, podemos hacer dos cosas
Y como somos DBA de peso, queremos saber el por que, cierto?? 

Pues bien, para realizar esa gran tarea de análisis, ocupamos un comando no documentado de Sql*Plus llamado la conección preliminar, con lo cual no nos conectamos a la instancia Oracle, pero... tenemos acceso a muchas vistas del diccionario de datos
, así tal cual , realizamos una conección pero sin conectarnos
Acá va el ejemplo de ello
Seteamos la opción oculta llamada "Conexión preliminar"
[oracle@oracle10g oracle]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 26 04:20:56 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
SQL> set _prelim on
Posterior a eso, realizamos la conexión a la base de datos, pero esto en realidad no realizará la conexión , de hecho si tratará de hacerlo se quedaría pegada.
SQL> conn / as sysdba
Prelim connection established
Si quisieramos ejecutar alguna consulta , aparecería el siguiente mensaje
SQL> select file_name from dba_data_files;
select file_name from dba_data_files
*
ERROR at line 1:
ORA-01012: not logged onSQL>
Y esto es porque en realidad, no hemos hecho la conexión, pero si podemos obtener información estadística, por ejemplo para hacer un trace de la sesión y así poder detectar el error.
Para realizar el comentado trace, podemos ocupar otro utilitario no documentado
parece cuento , este utilitario es el oradebug , para ello ocupamos los siguientes comandos.
SQL>
SQL> oradebug setmypid
Statement processed.
SQL> oradebug unlimit
Statement processed.
SQL> oradebug hanganalyze 3
Hang Analysis in /u01/app/oracle/admin/orcl/udump/orcl_ora_5417.trc
Ahora viene la explicación de los comandos utilizados
Este nivel puede ser :
Y claro , ahora viene la revisión del archivo de trace generado , la visualización del problema y el reinicio de la instancia Oracle ![]()
El tamaño del archivo de trace esta dado por el parámetro MAX_DUMP_FILE_SIZE , pero si queremos un tamaño mayor , ejecutamos el comando
SQL> oradebug unlimit
Antes de hacer el debug del trace
Espero les sirva
![]()
![]()
27.08.09. 18:19:56. 480 words, 9404 views. Categories: Base de datos, Tuning / Performance, Sql*Plus , 1 comment » • Send a trackback »