Ayuda con batch y sql plus

Iniciado por crisoof, 29 Diciembre 2014, 13:16 PM

0 Miembros y 1 Visitante están viendo este tema.

crisoof

Hola Buenos días :}

tengo un pequeño problema... mentira es grande !! T-T... sorry por la locura pero es que no se como sacar este maldito batch, de antemano indicar que lo que se de batch es una semana aprox investigando, en su web y en algunas otras, bueno dejando de lado tanto preámbulo



:ALLEXEC
CLS
COLOR  F6
::LOS COMENTARIOS SON PARA USTEDES QUIENES ME AYUDEN NO ESTAN EN EL CODIGO ORIGINAL

::ELIMINO UN .TXT QUE TIENE ALMACENADOS LAS COMUNAS DE UNOS ARCHIVOS CON CARTOGRAFIAS
DEL /F %LIST_WDG_PATH%LIST_COMUNAS.TXT
::LEE UN REPOSITORIO TOMA LOS ARCHIVOS NECESARIOS Y LOS IMPRIME EN EL TXT
FOR %%x in (%LIST_WDG_PATH%*.dwg) DO (echo %%x>>%LIST_WDG_PATH%LIST_COMUNAS.TXT
)
::ELIMINA UN TXT CON UNA COMUNA
DEL /F %LIST_WDG_PATH%COMUNAS.TXT
::TOMA LA LISTA DE COMUNAS Y ENTREGA EL NOMBRE DEL ARCHIVO A %%x
ADEMAS GENERA UN TXT CON CADA COMUNA DEL LISTADO
FOR /F "delims=!" %%x in (%LIST_WDG_PATH%LIST_COMUNAS.TXT) DO (echo %%x>%LIST_WDG_PATH%COMUNAS.TXT

::VARIABLE NECESARIA PARA EJECUTAR UN STORE PROCEDURE EN ORACLE
SET /A VARFULL=1
::ELIMINA TXT DONDE SE EJECUTAN LOS STORE PROCEDURE
DEL  %PATH_SQL%ESTADISTICA.SQL
::IMPRIME EN ESTADISITICA.TXT LA INSTRUCCION PARA EJECUTAR EL STORE PROCEDURE (SP)
ECHO EXEC sp_log_FULL(%VARFULL%);>>"%PATH_SQL%ESTADISTICA.SQL"
::AGREGA CODIGO A ESTADISTICA
ECHO COMMIT;>>"%PATH_SQL%ESTADISTICA.SQL"
::AGREGA SALIDA A ESTADISTICA
ECHO EXIT;>>"%PATH_SQL%ESTADISTICA.SQL"
::STRING DE CONEXION PARA ORACLE
   sqlplus %conexion% @"%PATH_SQL%ESTADISTICA.SQL"

::LLAMADA A UN BAT QUE GENERA LA CARGA DE LOS ARCHIVOS A LA BD EN ORACLE
CALL "%PATH_SCRIPT%carga.bat"

:LO MISMO QUE ARRIBA SOLO EL VARFULL TIENE OTRO VALOR PARA EJECUTAR EL SP DE UNA MANERA DISTINTA
SET /A VARFULL=2
DEL "%PATH_SQL%ESTADISTICA.SQL"
ECHO EXEC sp_log_FULL(%VARFULL%);>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO COMMIT;>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO EXIT;>>"%PATH_SQL%ESTADISTICA.SQL"
   sqlplus %conexion% @"%PATH_SQL%ESTADISTICA.SQL"
)


LES EXPLICO EL CHORIZO...

el error se produce cuanto "seteo" las variables VARFULL todo lo anterior a la inicializacion de la variable funciona correctamente, pero luego de eso se cae, bueno para ser exacto, no se cae pero COMUNAS.TXT salta automaticamente a la ultima comuna y no genera la carga para cada comuna, solo para la ultima y tambien decir que si esta leyendo 5 archivos, el listado queda con 5 comunas pero comuna salta a la ultima e itera 5 veces con la ultima comuna...
alguna sugerencia para mi problema??

Muchas gracias por su tiempo... aaa y muy buen foro me han ayudado sin saberlo varias veces  ;-)

Eleкtro

#1
Buenas

Antes de setear la variable VARFUL, cometes 2 errores en el for:
CitarFOR /F "delims=!" %%x in (%LIST_WDG_PATH%LIST_COMUNAS.TXT) DO (echo %%x>%LIST_WDG_PATH%COMUNAS.TXT

1) No has cerrado la agrupación de instrucciones ().

2) Estás reescribiendo el archivo y por eso al final solo queda la última ""¿comuna?"" escrita, para adjuntar texto usa el operador de redireccionamiento correcto (>>).

FOR /F "delims=!" %%x in (%LIST_WDG_PATH%LIST_COMUNAS.TXT) DO (echo %%x>>%LIST_WDG_PATH%COMUNAS.TXT)

De todas formas te sugiero utilizar esta sintaxis:
(FOR /F "UseBackQ delims=!" %%# in (
   "%LIST_WDG_PATH%LIST_COMUNAS.TXT"
) Do (
   Echo %%#
))>"%LIST_WDG_PATH%COMUNAS.TXT"


Saludos!








crisoof

muchas gracias por tu respuesta elektro

no entendi CUANDO ME DICES QUE NO CERRE los parentesis, disculpa quizas es obvio lo que me dices pero luego de ver tantas veces el script ya no me fijo en casi nada, si pudieras ser un poquitin mas explicito lo agradeceria

y lo segundo de las comunas, lamentablemente necesito que tome de una en una las comunas, te explico lo que sucede es que la primera lista, me guarda a modo de log las comunas que perteneces a cada archivo y el txt comunas corresponde a la comuna que se esta cargando en la base de datos, todo me funcionaba de maravilla hasta que me dijeron que tenia que agregar estadisticas para saber los tiempos de demora de las cargas de las comunas de los sp y me echaron a perder la vida :D... en fin, el txt comuna es para que se carguen en forma individual la comuna 1, 2 ..3 etc comunas, y para cada comuna tiene que tomar la info del archivo carga la base de datos y me genera estadística ademas de otros sp que refinan la información pero todo esto de manera automática por eso genero dos lista una que tiene toda la info y otra que le dice al batch lo que vaya haciendo comuna por comuna, espero no marear con mis explicaciones redundantes, sorry xD

Gracias de nuevo por tu tiempo y el de los que pasan por mi tema

Eleкtro

Cita de: crisoof en 29 Diciembre 2014, 15:08 PMno entendi CUANDO ME DICES QUE NO CERRE los parentesis, disculpa quizas es obvio lo que me dices pero luego de ver tantas veces el script ya no me fijo en casi nada, si pudieras ser un poquitin mas explicito lo agradeceria

Pues eso, que aquí te dejaste un paréntesis abierto:
CitarDO (echo %%x>%LIST_WDG_PATH%COMUNAS.TXT

Me quedo con la duda de a que te referías con lo de "comuna", nunca escuché ese término en lo referente a la programación, ¿ tendrá algo que ver con una tabla o columna de una SQL-Db ?.

Saludos!








crisoof

MUCHAS GRACIAS POR TUS RESPUESTAS ELEKTRO ANTES QUE TODO,


veo que mi explicaciones siguen siendo malas xD

elektro cuando me dices que el paracentesis quedo abierto, no es asi lo cierro al final del codigo (no se como citar pondría la parte del código, pero al final, final ese parentesis es para cerrar el for)... ahora porque se cierra ahi, se cierra ahi porque necesito que para cada comuna (explicare abajo a que me refiero con comuna...) genere esas instrucciones, la llamada al bat y los procedimientos almacenados


... comuna...DICESE DEL TERMINO XD... LAS COMUNAS CORRESPONDEN A UNA TABLA EN EL ESQUEMA DE MI BD, PERO NO ES TOMADO EN CUENTA EN ESTE CASO EN PARTICULAR, ME REFIERO A COMUNAS POR QUE EL DOCUMENTO SE LLAMA COMUNAS.TXT Y LAS INSTRUCCIONES PARA LA CARGA DE INFORMACIÓN EN LA BASE DE DATOS ES A NIVEL DE COMUNA EN VEZ DE SER A NIVEL DE CHILE, Y ESO DEPENDE DE LOS ARCHIVOS QUE LEE, ESOS ARCHIVOS TIENEN LA CARTOGRAFÍA DE X COMUNA EN SU NOMBRE DE ARCHIVO,ESO SE EXTRAE POR MEDIO DE OTRO PROCESO Y ASI LE DICE SE CARGA EN LA BASE DE DATOS UNA COMUNA A LA VEZ, EJEMPLO, LAS CALLES DE LA COMUNA 1, LAS MANZANAS DE LA COMUNA 1, LAS CASAS DE LA COMUNA 1, LOS NEGOCIOS DE LA COMUNA 1, Y LUEGO TOMAS LAS CALLES DE LA COMUNA 2, LAS MANZANAS DE LA COMUNA 2, ETC, ASI HASTA QUE TERMINA CON EL LISTADO CONTENIDO EN LIST_COMUNAS.TXT

P.D. disculpa por escribir en mayúsculas, es que programo en la Bd en mayuscula, asi me es mas facil y no me di cuenta que estaba escribiendo aqui con mayuscula, espero no se tome a mal, mientras termino lo del bat me siguen pidiendo cosas por eso escribo un poquito y luego trabajo en las cosas que me piden xD, gracias nuevamente


Eleкtro

#5
Cita de: crisoof en 29 Diciembre 2014, 16:02 PMelektro cuando me dices que el paracentesis quedo abierto, no es asi lo cierro al final del codigo

Culpa mia, para serte sincero (y sin ánimo de ofender) vi la instrucción de ese FOR single-line y no seguí leyendo el resto del código al no ver un paréntesis de cierre, supuse que ahí estaba el problema, ya que aparte de que el código es bastante inteligible al no estar indentado y todo en mayúsculas, no me di cuenta que utilizabas la variable del FOR más abajo, culpa mia por mirarlo aprisa. Por eso te dije también lo del "mal" redireccionamiento.

Olvida todo lo que dije entonces, como veo que el problema no era lo que a mi me parecia en un principio, ahora necesito preguntarte:
¿Que significa "se cae"?, ¿cual es el problema con el código?, da detalles del error.
Si "se cae" significa que se te cierra la instancia de la CMD (probablemente debido a un error de sintaxis) entonces primero ejecuta la CMD y desde allí inicias el Script para que no se cierre y poder ver el detalle del error que te salga.

De todas formas lo he examinado de nuevo (esta vez bien hecho xD, disculpa), y veo que intentas setear la misma variable (varfull) dentro del bloque del For y utilizarla, pero esto no es posible (no de la forma en la que lo haces) ya que a menos que expandas la variable siempre devolverá el mismo valor con el que la inicializaste.

Para resolver este problema podrías utilizar la declaración "Setlocal EnableDelayedExpansion", o utilizar el comando Call.

EDITO: Aparte de eso, estás usando los caracteres reservados de agrupación () al usar el comando Echo, si quieres que el último paréntesis se escriba ) tienes que escaparlo.

Prueba así:
FOR /F "UseBackQ delims=!" %%x in (
"%LIST_WDG_PATH%LIST_COMUNAS.TXT"
) Do (
Echo %%x>"%LIST_WDG_PATH%COMUNAS.TXT"
SET /A "VARFULL=1"
DEL "%PATH_SQL%ESTADISTICA.SQL"
Call ECHO EXEC sp_log_FULL^(%%VARFULL%%^);>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO COMMIT;>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO EXIT;>>"%PATH_SQL%ESTADISTICA.SQL"
sqlplus %conexion% @"%PATH_SQL%ESTADISTICA.SQL"
CALL "%PATH_SCRIPT%carga.bat"
Call SET /A "VARFULL=2"
DEL "%PATH_SQL%ESTADISTICA.SQL"
Call ECHO EXEC sp_log_FULL^(%%VARFULL%%^);>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO COMMIT;>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO EXIT;>>"%PATH_SQL%ESTADISTICA.SQL"
sqlplus %conexion% @"%PATH_SQL%ESTADISTICA.SQL"
)


EDITO: Puedes simplificarlo de esta manera (aunque no estoy seguro de si elcódigo hace lo que quieres, ya que no manejo SQL):

FOR /F "UseBackQ Delims=!" %%# In (
"%LIST_WDG_PATH%LIST_COMUNAS.TXT"
) Do (
(Echo %%#)>"%LIST_WDG_PATH%COMUNAS.TXT"

For /L %%x In (1, 1, 2) Do (
(
Call Echo:EXEC sp_log_FULL^(%%x^);
Echo:COMMIT;
Echo:EXIT;
)>"%PATH_SQL%ESTADISTICA.SQL"
SQLplus.exe "%conexion%" @"%PATH_SQL%ESTADISTICA.SQL"
)
)


Saludos!








crisoof

Gracias por tus respuestas elektro, ahora revizare el codigo y lo ejecutare a ver que sale y le dare un par de vueltas a ver que sale y te cuento, quizas si lo termino le pueda servir de ayuda a alguien y pondre todo el script una vez termine, gracias de nuevo lo mirare ahora vuelva del almuerzo xD

Saludos

crisoof

#7
gracias nuevamente

lamentablemente no me sirvió del todo tu script.. el problema radica en que el txt de comuna salta a la ultima comuna, y no pasa por las comunas anteriores, bueno ahora logre hacer que que se impriman las  comunas pero me aparece un error, el bat me indica  

CitarEl proceso no tiene acceso al archivo porque está siendo utilizado por otro proc
eso.

MODIFIQUE EL CODIGO DE LA SIGUIENTE MANERA

DEL /F %LIST_WDG_PATH%LIST_COMUNAS.TXT
FOR %%x in (%LIST_WDG_PATH%*.dwg) DO (echo %%x>>%LIST_WDG_PATH%LIST_COMUNAS.TXT
)

DEL /F %LIST_WDG_PATH%COMUNAS.TXT
FOR /F "UseBackQ delims=!" %%x in (%LIST_WDG_PATH%LIST_COMUNAS.TXT) DO (echo %%x>"%LIST_WDG_PATH%COMUNAS.TXT"

SET /A VARFULL=1
DEL  %PATH_SQL%ESTADISTICA.SQL
ECHO EXEC sp_log_capas_ini^(%VARFULL%^);>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO COMMIT;>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO EXIT;>>"%PATH_SQL%ESTADISTICA.SQL"
   sqlplus %conexion% @"%PATH_SQL%ESTADISTICA.SQL"

CALL "%PATH_SCRIPT%carga.bat"

SET /A VARFULL1=2
DEL "%PATH_SQL%ESTADISTICA.SQL"
ECHO EXEC sp_log_capas_fin^(%VARFULL%^^);>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO COMMIT;>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO EXIT;>>"%PATH_SQL%ESTADISTICA.SQL"
   sqlplus %conexion% @"%PATH_SQL%ESTADISTICA.SQL"


no es una modificacion muy grande, yo ya habia llegado a tener ese resultado, no con las mimas modificaciones, pero llegue y como no entendia a que se referia con el mensaje modifique nuevamente, el script que me diste no me sirve porque estadistica.txt, necesito que tenga la variable 1 para que comience a contar el tiempo, luego ejecute el store procedure y estadistica ahora tenga el valor de  2




YA LISTO!!!, grande master!!, ya lo modifique tengo dos errores un ^de mas y como me dijiste la variable la reutilizo y el valor no se puede montar así que le cambie el nombre xD
de varfull a varfull1

maestro sorry por la libertad pero WEON te las mandaste!!  ;-) ;-) ;-), no sabes cuanto me cabecie con el bat, muchas gracias




[MOD]: Me alegro de que lo hayas solucionado, pero no hagas doble post :P