2010-09-01 7 views
3

Lorsque vous utilisez ROracle dans R, je veux lier certains paramètres aux données, donc je fais ceci:paramètres Bound dans les états ROracle SELECT

> dbh <- dbConnect('Oracle', 'user/[email protected]:port/sid') 
> st <- dbPrepareStatement(dbh, statement="SELECT x FROM mytab WHERE id=:1", 
          bind="character") 
> st <- dbExecStatement(st, data.frame(id=c("9ae", "1f3"), stringsAsFactors=F)) 
> fetch(st) 
    x 
0 FOO 

Ce qui est inattendu est qu'il utilise uniquement la première ligne de la trame de données pour faire le SELECT (si elle utilisait les deux lignes, je reçois 2 lignes de sortie dans ce cas, pas 1), contrairement à la documentation ROracle:

l'objet qui dbPrepareStatement produit est ensuite utilisé conjointement avec un data.frame (qui doit correspondre à la spécification liée) à des appels à dbExecStatement à exécuter pour chaque rangée de la data.frame.

que je fais ce mal, ou ne le verbiage ci-dessus peut-être seulement à appliquer INSERT/UPDATE déclarations?

Répondre

0

Je pense que vous avez mal compris. En gros, votre SQL a une variable de liaison, mais vous essayez de lier deux valeurs. La deuxième valeur est jetée. Peut-être que vous pouvez faire quelque chose de similaire en utilisant un opérateur IN dans votre SQL.

+0

Ce que je veux dire est de faire une sélection avec la première valeur, puis une autre sélection avec la deuxième valeur. C'est un cas d'utilisation courant d'exécuter une instruction avec plusieurs valeurs (milliers, peut-être) liées. –

+0

J'ai compris votre intention, mais je pensais que vous l'aviez mal exprimé. Désolé, je n'ai pas remarqué que vous avez spécifié le tag 'id' dans votre bloc de données. Oui, votre bloc de données comporte deux lignes et, selon les documents, il doit être exécuté pour chaque ligne. Peut-être y a-t-il un problème parce que vous n'avez pas spécifié de valeur 'row.names' dans le bloc de données? Je ne suis pas sûr que vous allez corriger cela sur une version aussi ancienne du paquet ROracle. –

+0

Je suis d'accord - mais cela fait un an et demi que je l'ai demandé, et je ne suis plus à l'entreprise avec le db Oracle, donc c'est une question plutôt académique à ce stade. =) –