Avatar billede baitianlong Nybegynder
08. september 2008 - 11:15 Der er 1 kommentar og
1 løsning

At lagre en Java String i en Oracle Clob

Jeg er ved at bliv sindssyg over Oracle. Hvorfor kunne de ikke bare lave en lang tekst datatype...

Jeg har soegt paa nettet mange steder og fundet mange foreslag, men de virker lidt besvaerlige og omhandler som regel indsaettelse af blot en kolonne nemlig clob'en.

Hvordan kan jeg lave en metode, som laver String om til Clob, naar jeg vil indsaette en hel raekke?

INSERT INTO tabel(navn, nummer, langtekst) VALUES('" + navn + "','" + nummer + "','" + stringToClob(langtekst) + "')

Det maa vaere en ret triviel opgave, da jeg formoder alle, der har skullet arbejde med Oracle har haft brug for dette. Derfor haaber jeg paa en let og elegant loesning.
Avatar billede baitianlong Nybegynder
08. september 2008 - 11:41 #1
Naa, man kan aabenbart bare indsaette strengen... :)
Avatar billede arne_v Ekspert
08. september 2008 - 14:39 #2
Du får problemer når din streng bliver meget lang.

Der er forskellige måder at gøre det på.

En af dem er at indsætte en tom CLOB og så opdatere den.

Eksempel:

import java.io.PrintWriter;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class OracleCLOB {
    public static void main(String[] args) throws Exception {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:arnepc3", "xxxx", "xxxx");
        con.setAutoCommit(false);
        Statement stmt = con.createStatement();
        try {
            stmt.executeUpdate("DROP TABLE lobbo");
        } catch (SQLException ex) {
            // ignore
        }
        stmt.executeUpdate("CREATE TABLE lobbo (id INTEGER, txt CLOB, PRIMARY KEY (id))");
        con.commit();
        stmt.executeUpdate("INSERT INTO lobbo VALUES(1,EMPTY_CLOB())");
        ResultSet upd = stmt.executeQuery("SELECT txt FROM lobbo WHERE id=1 FOR UPDATE");
        upd.next();
        PrintWriter pw = new PrintWriter(((oracle.sql.CLOB)upd.getClob(1)).getCharacterOutputStream());
        pw.println("Dette er en meget lang tekst !");
        pw.close();
        con.commit();
        ResultSet rs = stmt.executeQuery("SELECT id,txt FROM lobbo");
        while(rs.next()) {
            int id = rs.getInt(1);
            Clob c = rs.getClob(2);
            System.out.println(id + " " + c.getSubString(1L, (int)c.length()));
        }
        rs.close();
        stmt.executeUpdate("DROP TABLE lobbo");
        con.close();
    }
}

PS: Og skal koden bruge stil noget seriøst så brug parameters !
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester