jueves, 5 de noviembre de 2015

PLS-00306: wrong number or types of arguments in call to

PLS-00306: wrong number or types of arguments in call to procedure


Este error me estaba ocurriendo desde mi aplicación web en c# y mvc: "PLS-00306: wrong number or types of arguments in call to" procedure.

Despúes de verificar todos los nombres y tipos de parámetros en la firma del stored, me puse a revisar el código de mi aplicación web.

El error se produjo porqué estaba usando un nombre de parámetro incorrecto desde mi aplicación web c#:


cmdToExecute.Parameters.Add("p_personaid", OracleType.Number);
cmdToExecute.Parameters["p_personaid"].Direction = System.Data.ParameterDirection.Output;


Sé que no tiene sentido en este contexto pero ese parámetro "p_personaid"  no existía en la firma del stored procedure por lo que sólo tuve que corregir el nombre del parámetro.
 
Esto me sucedió por haber hecho un copy paste del código.

Espero les sirva. 

miércoles, 4 de noviembre de 2015

PLS-00703: multiple instances of named argument

Error PLS-00703: multiple instances of named argument


Trabajando con mi aplicación web en c#, me encontré este error PLS-00703: multiple instances of named argument al estar haciendo pruebas.

Estoy utilizando un stored procedure de Oracle el cual llamo desde mi aplicación con diversos parámetros.

Este error "PLS-00703: multiple instances of named argument" se produce cuando estás enviando un parámetro dos veces desde tu código.

En mi caso, este era mi error:

 cmdToExecute.Parameters.Add("p_lugardetrabajo", OracleType.VarChar).Value = _lugardetrabajo;
 cmdToExecute.Parameters.Add("p_direcciondetrabajo", OracleType.VarChar).Value = _direcciondetrabajo;
 cmdToExecute.Parameters.Add("p_cedulapno", OracleType.VarChar).Value = _cedulapno;
 cmdToExecute.Parameters.Add("p_horariosdeatencion", OracleType.VarChar).Value = _horariosdeatencion;
 cmdToExecute.Parameters.Add("p_cedulapno", OracleType.VarChar).Value = _cedulapno;
 cmdToExecute.Parameters.Add("p_email", OracleType.VarChar).Value = _email;
 cmdToExecute.Parameters.Add("p_paginaweburl", OracleType.VarChar).Value = _paginaweburl;     


Como ven estaba mandando el mismo parámetro dos veces.

Sólo tuve que remover uno de los dos y el programa funcionó correctamente.

Espero les sirva.

viernes, 30 de octubre de 2015

Cómo restaurar base de datos de Oracle 11g con el mismo nombre en otra máquina con RMAN

Restaurar base de datos de Oracle con el mismo nombre en otra máquina con RMAN


Es una tarea común tener que restaurar una base de datos de Oracle 11g con el mismo nombre con RMAN en una máquina local de desarrollo para hacer pruebas o tener un respaldo reciente disponible de la información.

Algunas consideraciones antes de continuar leyendo este post es que este procedimiento fue realizado con las siguientes condiciones:
  1. Base de datos de Oracle 11g orígen en modo archivelog
  2. Base de datos de Oracle 11g destino en modo archivelog
  3. Backup completo desde RMAN (backup database plus archivelog)
  4. La base de datos destino es una instalación reciente
  5. El nombre de ambas bases de datos es el mismo, tanto de la máquina de donde se tomó el backup como el de la máquina donde se va a restaurar.
He querido mencionar esto de manera rápida ya que cada ambiente tiene sus propias características y es probable que quien lea este post cuente con algunas variaciones de estas condiciones.
Además por lo que vi estoy muy seguro de que este procedimiento funciona también para una base de datos destino que no esté en modo archivelog.

En este ejemplo mi base de datos orígen se encuentra en la unidad D mientras que la base de datos destino se encuentra en la unidad C.

Acerca del backup:

1. Desde la máquina orígen realizar un backup de la base de datos completa incluyendo los archivelogs

RMAN>BACKUP DATABASE PLUS ARCHIVELOG;

Esta instruccion te generará archivos con la fecha actual sobre las carpetas flash_recovery_area/[instancia]/BACKUPSET y flash_recovery_area/[instancia]/AUTOBACKUP

Ejemplo:

D:\app\instancia\flash_recovery_area\INSTANCIA\AUTOBACKUP\2015_10_17
D:\app\instancia\flash_recovery_area\INSTANCIA\BACKUPSET\2015_10_17

2. Crear un pfile en la maquina orígen desde sqlplus:

SQL>CREATE PFILE='C:\TEMP\pfileINSTANCIA.ora' FROM SPFILE;

3. Copiar las carpetas anteriores en el recovery area de tu base de datos destino la cual puede ser una ruta diferente de unidad o directorio.

Ejemplo:

C:\app\administrator\flash_recovery_area\INSTANCIA

4. Copiar el PFILE a cualquier dirección temporal en tu máquina destino y modificar las rutas necesarias de acuerdo a las rutas en la máquina destino.

C:\TEMP\pfileINSTANCIA.ora

instancia.__db_cache_size=285212672
instancia.__java_pool_size=16777216
instancia.__large_pool_size=16777216
instancia.__oracle_base='C:\app\administrator'#ORACLE_BASE set from environment 
instancia.__pga_aggregate_target=587202560 
instancia.__sga_target=1090519040
instancia.__shared_io_pool_size=0
instancia.__shared_pool_size=738197504
instancia.__streams_pool_size=16777216
*.audit_file_dest='C:\app\administrator\admin\INSTANCIA\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='C:\app\administrator\oradata\INSTANCIA\CONTROL01.CTL'
*.db_block_size=8192
*.db_domain=''
*.db_flashback_retention_target=60
*.db_name='INSTANCIA'
*.db_recovery_file_dest='C:\app\administrator\flash_recovery_area'
*.db_recovery_file_dest_size=53687091200
*.diagnostic_dest='C:\app\administrator'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=INSTANCIAXDB)'
*.memory_target=1674575872
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'


Procedimiento restaurar base de datos de Oracle 11g en otra máquina con RMAN en la máquina destino:

*Recomiendo siempre abrir RMAN con la consola de windows como administrador para evitar otros problemas con los que me he topado.

Una cosa importante a mencionar es que tengo inicialmente el enterprise manager configurado en la base de datos destino pero al momento de restaurar este se corrompe y ya no puedo accederlo.
Estoy tratando de averiguar como levantarlo después de restaurar la base de datos pero eso será digno de otro post.

Van a necesitar el dbid de la base de datos orígen, esto lo consiguen con una consulta:

SQL>SELECT DBID FROM V$DATABASE;

Aquí los comandos RMAN y SQL con letras chicas para que puedan leerlo por líneas.

Desde RMAN:

RMAN TARGET /
SHUTDOWN IMMEDIATE;
SET DBID 4042975402; --dbid de la base de datos orígen
STARTUP NOMOUNT PFILE='C:\TEMP\pfileINSTANCIA.ORA'; --PFILE creado en la máquina orígen y colocado en la máquina destino
RESTORE CONTROLFILE FROM 'C:\app\administrator\flash_recovery_area\INSTANCIA\AUTOBACKUP\2015_10_17\O1_MF_S_893351462_C25KVQ6D_.BKP'; --el controlfile se encuentra en el backup en la carpeta AUTOBACKUP copiada anteriormente
ALTER DATABASE MOUNT;
CROSSCHECK BACKUP; --Identificar el backup disponible en el directorio de flash recovery area
DELETE NOPROMPT EXPIRED BACKUP;
CROSSCHECK ARCHIVELOG ALL;
DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
LIST BACKUP OF DATABASE; --consulta de backups disponibles y su contenido
LIST ARCHIVELOG ALL;
LIST BACKUP; --obtener el ultimo sequence number de los archivelog en el backup. *Sumar uno para la instrucción SET UNTIL abajo
RUN
{
SET NEWNAME FOR DATAFILE 'D:\APP\INSTANCIA\ORADATA\
INSTANCIA\SYSTEM01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\SYSTEM01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\
INSTANCIA\ORADATA\INSTANCIA\SYSAUX01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\SYSAUX01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\
INSTANCIA\ORADATA\INSTANCIA\UNDOTBS01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\UNDOTBS01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\
INSTANCIA\ORADATA\INSTANCIA\USERS01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\USERS01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\
INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_IDX01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_IDX01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\
INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_IDX02.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_IDX02.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\
INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_DAT01.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_DAT01.DBF';
SET NEWNAME FOR DATAFILE 'D:\APP\
INSTANCIA\ORADATA\INSTANCIA\INSTANCIA_DAT02.DBF' TO 'C:\app\administrator\oradata\INSTANCIA\INSTANCIA_DAT02.DBF';
SET UNTIL SEQUENCE 6921 THREAD 1;
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RECOVER DATABASE;
}
SQL "ALTER DATABASE RENAME FILE ''D:\app\instancia\oradata\
INSTANCIA\REDO03.LOG'' TO ''C:\app\administrator\oradata\INSTANCIA\REDO03.LOG''";
SQL "ALTER DATABASE RENAME FILE ''D:\app\
instancia\oradata\INSTANCIA\REDO02.LOG'' TO ''C:\app\administrator\oradata\INSTANCIA\REDO02.LOG''";
SQL "ALTER DATABASE RENAME FILE ''D:\app\
instancia\oradata\INSTANCIA\REDO01.LOG'' TO ''C:\app\administrator\oradata\INSTANCIA\REDO01.LOG''";
ALTER DATABASE OPEN RESETLOGS;


Ahora desde SQLPLUS: Crear un SPFILE desde el PFILE y reemplazar el tablespace temporal.

SQL> CREATE SPFILE FROM PFILE='C:\TEMP\pfileINSTANCIA.ORA';
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;
SQL> CREATE TEMPORARY TABLESPACE TEMP01 TEMPFILE 'C:\app\administrator\oradata\INSTANCIA\TEMP0101.dbf' SIZE 200M AUTOEXTEND ON;

SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP01;
SQL> DROP TABLESPACE TEMP INCLUDING CONTENTS AND DATAFILES;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP NOMOUNT;
SQL> ALTER DATABASE MOUNT;
SQL> ALTER DATABASE OPEN;


Espero les sirva.

Recientemente he escrito un nuevo artículo más completo sobre cómo restaurar backup de RMAN en otro servidor windows con las mismas rutas.




Cómo activar o desactivar el modo archivelog en Oracle 11g

Activar o desactivar modo archivelog en Oracle 11g


Aquí les dejo las instrucciones comunes que van a necesitar para cambiar el archivelog mode en Oracle.
Para saber en qué archivelog mode se encuentra la base de datos, utilicen el comando archive log list desde sqlplus entrando como sysdba.

Ejemplo:

C:\Users\administrator>sqlplus / as sysdba

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     4
Current log sequence           6


Para activar el modo archivelog.

Apagar, iniciar en estado mount, poner en archivelog y abrir la base de datos.

SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.

Para desactivar el modo archivelog.

Apagar, iniciar en estado mount, desaactivar archivelog y abrir la base de datos.

SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database noarchivelog;
Database altered.
SQL> alter database open;
Database altered.

Abajo les dejo el script completo en la línea de comandos:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Users\administrator>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Fri Oct 30 10:31:58 2015

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     4
Current log sequence           6
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 4960579584 bytes
Fixed Size                  2184232 bytes
Variable Size            2617248728 bytes
Database Buffers         2332033024 bytes
Redo Buffers                9113600 bytes
Database mounted.
SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.

Total System Global Area 4960579584 bytes
Fixed Size                  2184232 bytes
Variable Size            2617248728 bytes
Database Buffers         2332033024 bytes
Redo Buffers                9113600 bytes
Database mounted.
SQL> alter database noarchivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL>


Espero les sirva.

jueves, 29 de octubre de 2015

Cómo desinstalar Oracle 11g en windows

Desinstalar oracle 11g en windows


He estado haciendo algunas pruebas de recuperación de base de datos oracle 11g y en el proceso he dejado la base de datos corrupta en múltiples ocasiones. Es por esto que en algunos casos no me queda de otra mas que desinstalar Oracle 11g completamente.

Les dejo aquí los pasos para desinstalar Oracle 11g en windows.

1. Abrir una consola de windows en modo de aministrador y moverse hacia el siguiente directorio con el comando cd:

cd C:\app\administrator\product\11.2.0\dbhome_3\deinstall

 *Si no se abre en modo de administrator puede arrojar errores al hacer escrituras o tratar de remover directorios

2. Abrir el archivo deinstall.bat

C:\app\administrator\product\11.2.0\dbhome_3\deinstall>deinstall.bat

Esto va a iniciar la herramienta ORACLE DEINSTALL & DECONFIG

Las siguientes son las preguntas a responder. Las respuestas varian dependiendo de cada instalación.

Entre corchetes está la opción default que es la que más uso así que sólo doy ENTER en los casos que así corresponda.

En este caso la instalación tiene almacenamiento tipo File System (FS) y he reemplazado el nombre de mi instancia por INSTANCIA.

Specify all Single Instance listeners that are to be de-configured [LISTENER]: ENTER

Specify the list of database names that are configured in this Oracle home [INSTANCIA]: ENTER

Specify the type of this database (1.Single Instance Database|2.Oracle Restart Enabled Database) [1]: ENTER

Specify the diagnostic destination location of the database [C:\app\administrator\diag\rdbms\INSTANCIA]: ENTER

Specify the storage type used by the Database ASM|FS []: FS

Specify the list of directories if any database files exist on a shared file system. If 'INSTANCIA' sub
directory is found, then it will be deleted. Otherwise, the specified directory will be deleted. Alt
ernatively, you can specify list of database files with full path [ ]: ENTER


Specify the flash recovery area location, if it is configured on the file system. If 'INSTANCIA' subdir
ectory is found, then it will be deleted. []: C:\app\administrator\flash_recovery_area


Specify the database spfile location [ ]: C:\app\administrator\product\11.2.0\dbhome_3\database

Do you want to continue (y - yes, n - no)? [n]: y

Esto iniciara el proceso de desinstalación de Oracle 11g

Los siguientes son los elementos que va a remover la herramienta ORACLE DEINSTALL & DECONFIG:
  • Instancia de Base de datos especificada.
  • Listener especificado.
  • Servicio de base de datos y agente.
  • Directorio home de oracle.
3. Si es necesario verificar que los directorios hayan sido eliminados.

No todos los archivos son eliminados en la desinstalación por lo que tal vez requieras eliminarlos manualmente. De cualquier manera estos archivos ya no tienen ninguna funcionalidad.

Espero les sirva.




domingo, 30 de agosto de 2015

Cómo ejecutar como administrador desde la consola de windows o command prompt

Tuve algunos problemas con mi máquina y me vi en la necesidad de sólo poder utilizar la consola de windows o command prompt en modo de administrador.

Una de las tareas que tenía que hacer era eliminar archivos pero no podía por estar usando la consola de windows sin haber seleccionado la opción de ejecutar como administrador, y me salía el mensaje de que no tenía suficientes privilegios. 

Al no poder usar la opción de click derecho ejecutar como administrador sobre el command prompt (Inicio - Programas - command prompt). Tuve que ejecutarlo desde la misma consola de windows.

Les dejo aquí este tip para ejecutar como administrador desde la consola de windows o command prompt con el comando runas

Desde la consola de windows o command prompt ejecutar alguna de estas opciones dependiendo de la configuración que tengan:

C:\> runas /user:administrator cmd

C:\> runas /user:<NombreDeLaMaquina>\administrator cmd

C:\> runas /user:<Dominio>\<UsuarioAdministrador> cmd

Les va a pedir el password del usuario para poder continuar. 

Una vez hecho esto podrán tener el command prompt en modo administrador.



Espero les sirva.

martes, 4 de agosto de 2015

SoapUI error al cargar o agregar WSDL

unable to find valid certification path to requested target


Me salía este error al intentar agregar un WSDL en soapui a través de la opción: File - New SOAP Project

Error loading [https:// wsdl ]:
org.apache.xmlbeans.XmlException: javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target

El error se debe a que el servicio está sobre el protocolo https y al requerir un certificado, éste se tiene que agregar al archivo cacerts del JRE de SoapUI.

SoapUI viene con su propio JRE por lo que se tiene que utilizar la herramienta keytool que se encuentra dentro del JRE de SoapUI.

Solución.

Los pasos para poder consultar el servicio https desde SoapUI son los siguientes:


1. Obtener el certificado del servidor.

Abrir la dirección del servicio desde un navegador y seleccionar el candado para ver el certificado. Seleccionar la opción View certificates. La manera de descargarlo varía un poco de acuerdo a cada navegador.
                                                                        



Seleccionar la opción Copy to File... para guardar el certificado. Pueden ponerlo donde sea pero yo lo puse en la ruta donde lo ocuparé después: C:\Program Files\SmartBear\SoapUI-4.6.4\jre\bin 


2. Abrir una ventana de comandos en modo administrador (Click derecho y ejecutar como administrador). Es importante como administrador ya que me topé con otro problema al no hacerlo.

3. Ir hacia el directorio jre/bin dentro de la carpeta de instalación de SoapUI.

cd C:\Program Files\SmartBear\SoapUI-4.6.4\jre\bin

4. Una vez ahí, ejecutar el comando para importar el certificado descargado anteriormente. En mi caso el certificado lo guardé ahí mismo por eso no le pongo ruta:

keytool -import -alias somealias -file a0319d127.cer -keystore ..\lib\security\cacerts

5. Preguntará por un password para el keystore. El password default es "changeit"

Enter keystore password: changeit


6. Preguntará si confías en el certificado: Introduce Yes o Y. Imagen abajo


7. Después de esto hay que reiniciar SoapUI e intentar nuevamente. Debes poder crear un nuevo proyecto con el servicio sobre https.


Espero les sirva.