Por que a declaração não funcionará no SQLQLQUERY no RODBC?
-
26-09-2019 - |
Pergunta
Mantemos todos os nossos dados de laboratório em um banco de dados Sybase. Quando quero fazer manipulação e análise de dados, leio os dados no R com RODBC.
library(RODBC)
channellab <- odbcConnect("Labdata")
indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen')
Até agora, tudo bem, exceto que CGs.Specimen é uma tabela para toda a nossa participação de laboratório. Existem quase 40000 amostras (linhas) com 66 variáveis. É preciso uma quantidade desnecessária de tempo para ler, especialmente quando estou interessado apenas nas participações de um estudo que possui cerca de 1000 espécimes. A maneira óbvia de consertar seria
indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode="RP"')
Mas quando eu corro, eu entendo
1] "42S22 -143 [Sybase] [Driver ODBC] [Servidor Adaptive em qualquer lugar] Não encontrada: coluna 'rp' não encontrada" [Rodbc] Erro: não foi possível sqlexecdirect 'selecionar * de cgs.specimen onde Studycode = "RP " '"
Eu brinquei com aspas e brinquei com barras de fuga, mas, infelizmente, não cheguei a lugar algum.
por exemplo
indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode= 'RP' ')
Erro: Símbolo inesperado em "INDIVs <-SQLQUERY (Channellab, 'Selecione * de CGs.specimen onde StudyCode =' RP"
indivs <-sqlQuery(channellab,"SELECT * from CGS.Specimen WHERE StudyCode= 'RP' ")
Erro em .Call (C_RODBCFETCHROWS, ATTT (Channel, "handle_ptr"), Max, BuffSize ,: Os vetores de comprimento negativo não são permitidos
O que você sugere?
Solução
O último erro que você relata é da função .Call para a função C RODBCFETCHROWS. Assim, seu problema com as aspas parece estar resolvido. No entanto, com o referido erro, você ainda tem um problema. Talvez as linhas não sejam relatadas corretamente (a função C tenta alocar vetores com base nesse valor, mas não verifica valores negativos). Tentar:
indivs <-sqlQuery(channellab,"SELECT * from CGS.Specimen WHERE StudyCode= 'RP'", believeNRows = FALSE)
Outras dicas
Editado:
indivs <-sqlQuery(channellab,'SELECT * from CGS.Specimen WHERE StudyCode=\'RP\'')
Ok, você pode executar outra consulta onde alguns dados são retornados?
WHERE StudyCode=StudyCode
por exemplo? Isso dá o mesmo erro sobre -ve os comprimentos?
Isso significa que o acima está correto para escapar do StudyCode. O lenght -ve é outro erro. Você pode retornar nem todas as colunas com *, mas colunas específicas onde não há nulos?
Tente opção believenrows = false. Isso funcionou para mim em um erro semelhante (o erro de comprimento negativo).
Esta questão foi mais direta ao ponto:Consultando Oracle DB da Revolução R usando Rodbc