2010-05-25 4 views
1

Dans le code JDBC, je suit qui travaille avec SQL Server:JDBC Modifier le code de SQL Server à Oracle

CallableStatement stmt = connection.prepareCall("{ call getName() }"); 

ResultSet rs = stmt.executeQuery(); 

if(rs != null) 
{ 

    while(rs.next()) 
    { 

    //do something with rs.getString("name") 

    } 

} 

Plusieurs lignes sont renvoyées à la situation ci-dessus.

Je comprends que l'utilisation d'un curseur est nécessaire pour parcourir la table dans Oracle, mais est-il possible de garder le même code et d'accomplir la même chose?

Un exemple de code PL/SQL serait très apprécié.

Merci d'avance.

Répondre

3

Vous pouvez mettre en œuvre getName() en fonction pipelinée:

CREATE OR REPLACE name_record AS OBJECT (name VARCHAR2(100)); 
/

CREATE OR REPLACE name_table AS TABLE OF name_record; 
/

CREATE OR REPLACE FUNCTION getName RETURN name_table PIPELINED 
AS 
    n name_record; 
BEGIN 
    -- I have no idea what you're doing here to generate your list of names, so 
    -- I'll pretend it's a simple query 
    FOR i IN (SELECT name FROM someTable) LOOP 
    n := name_record(i.name); 
    PIPE ROW(n); 
    END LOOP; 
END; 
/

Vous devrez modifier la requête réelle en Java pour SELECT name FROM TABLE(getName()).

+0

Existe-t-il un moyen d'approcher le code PL/SQL de telle sorte que rien ne doive être modifié en Java? – BeginnerAmongBeginners

+0

Je ne connais pas un moyen d'écrire une fonction Oracle qui fonctionnera avec votre code Java existant. Le problème que vous souhaitez conserver est-il une base de code Java unique qui fonctionnera avec les deux SGBDR? Si c'est le cas, la seule chose que vous devez faire varier entre les deux est un littéral de chaîne, que vous pouvez stocker en externe dans un fichier de ressources, et charger une ressource différente selon la base de données que vous utilisez. –

2

Il s'agit d'un JDBC direct. Il fonctionne donc avec toute base de données disposant d'un pilote JDBC valide.

Il suppose, bien sûr, que le proc stocké existe dans les deux et que vous n'utilisez pas de code non standard, propriétaire du fournisseur dans votre classe.

+0

Je n'ai pas encore la procédure stockée dans Oracle. Le renvoi d'un SYS_REFCURSOR avec une fonction suffirait-il pour le code ci-dessus? Exemple de code PL/SQL serait bien. – BeginnerAmongBeginners

+0

Un ResultSet est un curseur. Je suis sûr que votre exemple est simple, mais je ne pensais pas que l'API JDBC devait savoir si c'était Oracle en dessous. C'est tout l'intérêt de JDBC. S'il ne peut pas le faire, je dirais soit que c'est mal conçu ou que vous ne comprenez pas quelque chose. – duffymo

+1

La partie qui est spécifique au SGBDR est, je pense, "l'appel getName()". Je devine que dans SQL Server, getName() est une fonction qui renvoie plusieurs lignes, et que, en tant que convention, il les traite implicitement comme des requêtes. Oracle ne le permet pas. La construction la plus proche que je connaisse serait "call? = GetName()", ce qui nécessiterait des changements plus importants au code Java que l'autre réponse que j'ai soumise. –