Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Insertar CLOB en Oracle

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mar Feb 27, 2007 10:09 am
lyna041
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Feb 2007
Mensajes: 8
Insertar CLOB en Oracle Responder citando

¡Hola! Antes de nada deciros que soy bastante nueva con Perl, y el código que estoy haciendo es una recopilación de muchos otros códigos, así que puede ser que haya cosas bastante absurdas.

Mi problema es que estoy intentando introducir unos datos desde un fichero de texto a una base de datos Oracle, y dos de los campos tienen un tamaño mayor de 4000, que es lo permitido por el tipo de datos varchar2, por lo que tengo que utilizar el tipo de datos CLOB.
Buscando por Internet he visto que estos datos deben ser introducidos de una forma especial, utilizando la función bind_param.

Quizá no ponga bien los parámetros de esta función, o este haciendo cualquier otra cosa mal, porque al principio, al introducir los datos, cortaba el campo a 4000 caracteres, y ahora (no se lo que he cambiado), ni siquiera ejecuta el $sth->execute().

Este es el código que estoy utilizando:

<...>

Perl:
# Confeccionamos la query para la base de datos
        my $query = 'INSERT INTO todo ( ';
        my $cit = '';
        my $res = '';
        my $primero = '';
# El campo primero sirve para ver en que posicion se ponene el campo cit, o res en la funcion bind_param

# Se añaden los nombres de las columnas o campos
        foreach my $campo ( keys %registro ) {
                # Anadimos a la query. El nombre del campo lo sacamos de %campos definido arriba
                if ( $registro{$campo} ne '' ) {
                        $query .= qq( $campos{$campo} ,);
                }
        }               
        # Quitamos la ultima coma y la sustituimos por )
        substr($query,-1,1) = ')';
        # Se añaden los valores de los campos
        $query .= " VALUES (";
        foreach my $campo ( keys %registro ) {
                # Anadimos a la query. El nombre del campo lo sacamos de %campos
                if ( $registro{$campo} ne '' ){
                        if ( $campos{$campo} ne 'cit' && $campos{$campo} ne 'res' ) {   
                                $query .= qq( '$registro{$campo}' ,);                   
                        }
                        elsif($campos{$campo} eq 'cit') {
                                $query .= qq( ? ,);
                                $cit =qq('$registro{$campo}');
                                if ($primero eq ''){
                                        $primero = 'cit';
                                }
                        }
                        else {
                                $query .= qq( ? ,);
                                $res =qq('$registro{$campo}');
                                if ($primero eq ''){
                                $primero = 'res';
                                }
                        }
                }
        }       

 # Quitamos la ultima coma y la sustituimos por )
        substr($query,-1,1) = ')';
                #Preparamos los campos citas y res, de tipo CLOB, si se da el caso.
        if ($cit ne '' || $res ne ''){
                my $sth = $dbh->prepare($query);
                if ($cit ne '' && $primero eq 'cit'){
                        $sth->bind_param(1,$cit,{ora_type => ORA_CLOB});
                        if ($res ne ''){
                                $sth->bind_param(2,$res,{ora_type => ORA_CLOB});
                        }
                }
                elsif ($res ne '' && $primero eq 'res'){
                        $sth->bind_param(1,$res,{ora_type => ORA_CLOB });
                        if ($cit ne ''){
                                $sth->bind_param(2,$cit,{ora_type => ORA_CLOB });
                        }

                }
                print "Antes de execute\n";
                 $sth->execute() or die("Couldn't execute statement: " . $sth->errstr);
                print "Despues de execute\n";
        }
        else {
                # Ejecutamos la query en la base de datos
                #print "$query\n", '#'x40, "\n";
                $dbh->do($query);
        }


<...>

La salida de este código es "Antes de execute", una sola vez, es decir, el problema esta en "$sth->execute()", pero como no me avisa de ningún error, no se que es lo que falla.
Muchas gracias de antemano.

Por cierto, se me olvidaba decir que este código si funciona si no introduzco los campos CLOB, y si necesitáis el resto del script lo puedo mostrar.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group