Power Builder - pasar parametro BLOB a oracle

   
Vista:

pasar parametro BLOB a oracle

Publicado por milson cardona (613 intervenciones) el 22/08/2009 02:06:57
Buenas noches, necesito resolver una duda

es posible pasar parametros tipo BLOB (BINARY LARGE OBJECT) desde una aplicacion en power builder a un store procedure de oracle???

es que tengo un SP de oracle que recibe un parametro IN tipo BLOB, desde power builder llamo el SP, y le mando el valor BLOB, pero al store procedure al parecer no le llega nada... es decir le llega el BLOB en NULL, a pesar que yo estoy seguro que la variable BLOB en power builder si tiene valor..

si es posible pasar dicho parametro, me pueden indicar un código para hacerlo, o una referencia para consultar mas??

muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:pasar parametro BLOB a oracle

Publicado por miguel (153 intervenciones) el 23/08/2009 07:12:16
A lo mejor ya lo estás haciendo: Puedes probar pasando el blob por referencia: Usar REF en la declaración de la función en powerbuilder y usar IN OUT para el argumento de Oracle, pero .........

Creo que simplemente NO se pueden pasar / recibir datos de más de 32Kb en la comunicación con una función de Oracle. Si me recuerdo bien, intenté una vez recibir un blob y me daba ese error "limitación de 32K". (eso fue con pb5).

¿no puedes crear alguna tabla temporal y actualizar un campo blob de powerbuilder (UPDATEBLOB)? Claro, luego tendrías que cambiar la función para que lea el valor de la base de datos en vez de recibirlo....

espero que sirva,
miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:pasar parametro BLOB a oracle

Publicado por milson cardona (613 intervenciones) el 24/08/2009 15:35:51
muchas gracias por reponder amigo... ya lo hice grabando con UPDATEBLOB y lo recupero con SELECTBLOB... todo desde power... pero ahora quiero hacer ese mismo procedimiento pero en paquetes oracle y llamarlos dede power builder y desde java... de esta manera me evito hacer la programacion en cada lenguaje...

probaré lo que me dices y te cuento como me fue... yo trabajo con POWER 10.5 y ORACLE 10g
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

URGENTE no me funciono

Publicado por milson cardona (613 intervenciones) el 24/08/2009 16:51:55
HOLA miguel... necesito tu ayuda URGENTE amigo... no me funciono pasando el parametro por referencia... te paso el codigo que pongo

definicion del SP en la variable transaccional:
subroutine SPR_BLOB_GRABAR(long param1,Long param2,REF blob blob_pdf) RPCFUNC ALIAS FOR "SPR_BLOB_GRABAR"

definicion del SP en ORACLE:
create or replace PROCEDURE spr_blob_grabar(param1 IN NUMBER,param2 IN NUMBER,blob_pdf IN OUT BLOB)

llamado del SP desde ORACLE
blob lbl_data
long param1,param2

param1 = 1
param2 = 2
ll_File = FileOpen(ls_ruta_completa_archivo, StreamMode!)
FileReadEx(ll_file,lbl_data)
FileClose(ll_file)

SQLCA.SPR_BLOB_GRABAR(param1,param2,lbl_data);

aqui me saca un error R0085,

"application terminate
error in reference argument passed in function/event"

espero que me puedan colaborar... es un tanto urgente

muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ya me funciono, pongo la solucion

Publicado por milson cardona (613 intervenciones) el 25/08/2009 23:06:09
ORACLE y BLOB y POWER BUILDER (esto es para que lo encuentren facil en los buscadores)

Buenas tardes amigos, para el que tenga el mismo problema o necesidad de intercambiar datos BLOB entre oracle y power builder pondré una página donde explican detalladamente con ejemplo como hacerlo...

dos cosas principalmente me llaman la atencion...
PRIMERA que en ORACLE los datos BLOB que envio desde POWER los debo recibir en PARAMETROS tipo LONG RAW.

SEGUNDA que si los archivos pesan mas de 32k entonces se debe enviar por partes o CHUNKS hasta completar el archivo...

excelente solución y funciona sin mayor esfuerzo... al menos yo le tuve que hacer muy pocos retoques para adaptarlo a mis necesidades

http://brucearmstrong.wordpress.com/2008/12/10/reading-and-writing-a-blob-in-chunks/

disfrutenlo y por favor, al que le sirva conteste en este post como le pareció y las dificultades o aportes que tengan que hacer... no quiero que a nadie mas le toque buscar 6 dias una solución para algo tan sencillo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:pasar parametro BLOB a oracle

Publicado por Miguel, mjlreina38-hotmail.com (153 intervenciones) el 30/08/2009 04:34:42
perdona por la tarde respuesta (estuve liadisimo). Me alegro que hayas encontrado la solución de Bruce Armstrong. A mi no me valió la solución ya que los archivos eran bastantes "grandes" (90 MB) y el envío / la lectura de powerbuilder en bloques de 32Kb resultó demasiado lento con la conexión que tuvimos.

Estuve probando también otra solución: (en nuestro caso, la finalidad del programa era grabar mapas digitalizados en la base de datos).
Era un proceso lento por 2 razones:
1) el selectblob / updateblob es bastante lento (internamente estas funciones (supongo que), leen y escriben en múltiples bloques).
2) lo que había que hacer por ejemplo era leer de la base de datos y escribir el blob luego en bloques de 32kb al disco duro para luego poder visualizar con OLE por ejemplo un pdf en acrobat o documento en word. También había que actualizar ficheros desde disco a base de datos, claro.

el 1) intenté solucionarlo con una funcion de oracle, ya que existe una forma de leer un archivo de golpe hacia un clob / long raw. La ventaja era que no había que usar bloques de 32kb de esa forma para el update y que desde dentro de una función de oracle eso va muy rápido). No me acuerdo de los nombres de las funciones, creo que era algo como "import o Load y export", si no me equivoco. La limitación de esas funciones era que el archivo tendría que estar en el mismo servidor / disco que la base de datos y si no, habría que leer y escribir en bloques también (de 65kb me suena). No nos valío, ya que el usuario entonces tendría que tener permisos de lectura y escritura y el cliente no nos permitió eso. (cliente govierno con mucha seguridad espesa).
Dejé de investigar por falta de tiempo y no puedo decir si funcionaría o no.
Tampoco iba tan mal el updateblob (el selectblob es más problemático).

el 2) lo solucioné con una api de windows:
mientras que el archivo está en el disco duro del cliente (si no también en bloques), se pueden usar:

Function boolean ReadFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"

Function boolean WriteFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"

En vez de tardar 4 minutos para escribir / leer un archivo de 5 mb en disco, usando bloques de 32kb, tarda 1 segundo.

Todo esto por si alguién se encuentra con el mismo problema o parecido. Postearé dos objetos exportados para manejar los Apis del punto 2). (código exportado en versión 5 de powerbuilder, que no se rie nadie, nuestro cliente es así de atascado).

Saludos,
Miguel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

necesito tu ayuda por fa..

Publicado por helmut (2 intervenciones) el 31/10/2009 19:04:31
referente al codigo que pusiste:

Function boolean ReadFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"

Function boolean WriteFile ( &
ulong hFile, &
Ref blob lpBuffer, &
ulong nNumberOfBytesToRead, &
Ref ulong lpNumberOfBytesRead, &
ulong lpOverlapped &
) Library "kernel32.dll"


ME PODRIAS DECIR CUAL ES LA SINTAXIS EN POWER BUILDER GRACIAS
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar