RE:pasar parametro BLOB a oracle
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