Mostrando las entradas con la etiqueta Oracle. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Oracle. Mostrar todas las entradas

jueves, marzo 29, 2012

Crear un sinonimo publico en Oracle

En ocasiones resulta necesario acceder a información de una tabla que se encuentra en otro esquema, para ello  Oracle permite crear nombres públicos a las tablas para que cualquier usuario pueda acceder al contenido de la tabla.

Para poder crear un sinónimo primer debes loguearte con una cuenta sysdba, crear el sinónimo y acceder con otro usuario para verificar que se puede acceder a la tabla.

conn / as sysdba;
create public synonym dept  for scott.dept;
disconnect;

Luego de crear el sinónimo debes loguearte con una cuenta diferente para verificar el acceso a la tabla con la siguiente consulta:


select * from dept;


Ver transacciones pendientes de commit y rollback en Oracle

La vista dba_2pc_pending  guarda las transacciones pendientes de commit y rollback. Para poder ejecutarla debes loguearte con una cuenta de sysdba a la BD Oracle:

select * from dba_2pc_pending;

FM : Quitar espacios de las fechas en ORACLE

La siguiente instrucción obtiene la fecha

SELECT ename, to_char(hiredate,'day DD Month YYYY') AS
hiredate
FROM emp



y la siguiente añade 'fm' dentro del formato:


SELECT ename, to_char(hiredate,   'fmday DD Month YYYY') AS
hiredate
FROM emp





se nota la diferencia?

BULK COLLECT en ORACLE

Bulk Collect es la forma como Oracle maneja arreglos. puedes usarlo si quieres evitar el uso excesivo de cursores. la ventaja de Bulk Collect es que se maneja en memoria y evita la escritura a disco, por lo cual resulta optimo guardar datos con Bulk Collect.

Hay que tener en cuenta que no debemos utilizar grandes cantidades de información con Bulk Collect porque la memoria del servidor Oracle se puede ver afectado y a la vez tambien afectar otros procesos.

Este es un pequeño ejemplo donde se pasa toda la informacion de la tabla PRODUCTOS al arreglo PRODUCTOS_COLECCION


CREATE TABLE PRODUCTOS
(
  COD_PRODUCTO VARCHAR(10),
  DES_PRODUCTO VARCHAR2(50),
  FLG_ACTIVO CHAR(1)
);

INSERT INTO PRODUCTOS VALUES ('1','ARROZ','S');
INSERT INTO PRODUCTOS VALUES ('2','ACEITE','S');
INSERT INTO PRODUCTOS VALUES ('3','AZUCAR','S');

DECLARE 
  
  TYPE PRODUCTO_FILA IS RECORD (COD_PRODUCTO VARCHAR(10),
                                DES_PRODUCTO VARCHAR2(50),
                                FLG_ACTIVO CHAR(1));
  
  TYPE TYPE_TABLA_PRODUCTOS IS TABLE OF PRODUCTO_FILA; 
  PRODUCTOS_COLECCION TYPE_TABLA_PRODUCTOS; 
  
 BEGIN
 
    SELECT COD_PRODUCTO,DES_PRODUCTO,FLG_ACTIVO
    BULK COLLECT INTO PRODUCTOS_COLECCION 
    FROM PRODUCTOS;
    
    --OBTENER LA DESCRICPION DE LOS PRODUCTOS
    FOR  I IN 1 .. PRODUCTOS_COLECCION.COUNT 
    LOOP
       DBMS_OUTPUT.PUT_LINE(PRODUCTOS_COLECCION(I).DES_PRODUCTO);    
    END LOOP;
    
 END;

ORA-01000: número máximo de cursores abiertos excedido

Este error se debe a que la sesión alcanzó el límite máximo permitido de cursores abiertos.

para solucionar este problema existen una serie de recomendaciones que van desde la manipulación de los parametros de la base de datos Oracle para que soporte mas cursores o la mejora de la aplicacion donde se originó el error.


Puedes obtener el número de cursores permitidos con la siguiente consulta:

SELECT VALUE FROM V$PARAMETER WHERE NAME='open_cursors';

para modificar este valor lo puedes hacer con la siguiente instrucción:


ALTER SYSTEM SET OPEN_CURSORS = 1000;

donde el numero 1000 será el máximo de cursores permitidos.

Hay que tener en cuenta que a pesar de elevar el número máximo de cursores permitidos esto va a depender del Sistema Operativo y del hardware.

Si este error te sucedió al ejecutar un procedimientos o script desde un programa enVisual Studio .NET, entonces hay una serie de mejores que debes tener en cuenta: 

la primera de ellas es hacer Dispose a los objetos que usas al momento ejecutar  la sentencia Oracle, cerrar el componente OracleDataReader.

A continuación dejo una tabla que indica a que objetos se puede hacer dispose y close.


Clase
Método close
Método Dispose
OracleConnection
si
si
OracleDataReader
si
si
OracleBFile
si
si
OracleBlob
si
si
OracleClob
si
si
OracleXmlStream
si
si
OracleCommand

si
OracleDataAdapter

si
OracleRefCursor

si
OracleParameter

si
OracleCommandBuilder

si
OracleTransaction

si
OracleXmlType

si
OracleGlobalization

si

domingo, marzo 11, 2012

Update con join en ORACLE: /*+BYPASS_UJVC*/

El hint  /*+BYPASS_UJVC*/  se usa cuando queremos hacer un update utiliazando join. Si despues de la intruccion ON asociamos columnas que no son primary key entonces debemos colocar el hint inmediatamente despues del comando UPDATE:



UPDATE /*+ BYPASS_UJVC */
 ( SELECT ori.ID ori_ID,
                  ori.Descripcion ori_Descripcion,
                  dest.ID dest_ID,
                  dest.Descripcion dest_Descripcion
    FROM TABLA_ORIGEN ori, TABLA_DESTINO dest
    WHERE ori.ID = dest.ID)
SET dest_Descripcion = ori_Descripcion;