• Publicidad

Insertar CLOB en Oracle

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Insertar CLOB en Oracle

Notapor lyna041 » 2007-02-27 11:09 @506

¡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:

<...>

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 # 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);
        }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


<...>

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.
lyna041
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2007-02-27 10:50 @493

Publicidad

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados