Сбой предложения SQL "где" с соединением R JDBC HANA - PullRequest
1 голос
/ 21 октября 2019

У меня не было ничего, кроме проблем с подключением к базе данных HANA моей компании через R, но, наконец, произошел прорыв, однако теперь мой оператор sql не может выполнить подстановку данных с помощью оператора "где".

Следующее возвращает фрейм данных из 10 наблюдений по 9 переменным

# Fetch all results
rs <- dbSendQuery(jdbcConnection, 'SELECT TOP 10 
VISITTYPE,
ACCOUNT,
PLANNEDSTART,
PLANNEDEND,
EXECUTIONSTART,
EXECUTIONEND,
STATUS, 
SOURCE, 
ACCOUNT_NAME
                  FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit"')

a <- dbFetch(rs)

Однако, когда я добавляю куда-то в него, я получаю ошибку.

rs <- dbSendQuery(jdbcConnection, 'SELECT TOP 10 
VISITTYPE,
ACCOUNT,
PLANNEDSTART,
PLANNEDEND,
EXECUTIONSTART,
EXECUTIONEND,
STATUS, 
SOURCE, 
ACCOUNT_NAME
                  FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit" WHERE VISITTYPE = ZR')

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
  Unable to retrieve JDBC result set for SELECT TOP 10 
VISITTYPE,
ACCOUNT,
PLANNEDSTART,
PLANNEDEND,
EXECUTIONSTART,
EXECUTIONEND,
STATUS, 
SOURCE, 
ACCOUNT_NAME
                  FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit" WHERE VISITTYPE = ZR (SAP DBTech JDBC: [260] (at 222): invalid column name: ZR: line 11 col 101 (at pos 222))

Что это значит? ZR не столбец, это значение внутри столбца. Попытка размещения ZR в кавычках, без какого-либо другого эффекта.

Мой синтаксис двойных и одинарных кавычек основан на этом другом вопросе, который я задал.

Проблемы, связывающие R с HANA db со многимиспециальные символы

Никогда не работал с RODBC, поэтому попробовал JODBC.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Чтобы завершить предыдущий ответ (который, конечно, предпочтительнее, так как он использует переменные связывания ), здесь описывается * основная причина ** проблемы:

Использование single quote в одной строке в кавычках, конечно, должно быть экранировано

В отличие от Oracle , экранирующегося при удвоении кавычки R использует обратную косую черту.

то есть правильное использование выглядит следующим образом:

> df <-  dbGetQuery(jdbcConnection, 
+ 'select * from "DUAL" where "DUMMY" = \'X\'') 
> df
  DUMMY
1     X

альтернативный способ использования строки в двойных кавычках

> df <-  dbGetQuery(jdbcConnection, 
+ "select * from \"DUAL\" where \"DUMMY\" = 'X'") 
> df
  DUMMY
1     X
1 голос
/ 21 октября 2019

Вероятно, это обработка кавычек во встроенной строке, заключенной в кавычки, которая дополнительно усложняется символами двойной кавычки, используемыми в SQL для идентификаторов. Тем не менее, рассмотрите параметризацию (лучшую отраслевую практику при запуске SQL на уровне приложений, например R), чтобы избежать необходимости использовать пунктуацию или конкатенацию в кавычках. Как и большинство JDBC API, RJDBC поддерживает параметризацию . Также обратите внимание, что dbGetQuery в сумме соответствует dbSendQuery + dbFetch:

sql <- 'SELECT TOP 10 VISITTYPE,
                      ACCOUNT,
                      PLANNEDSTART, 
                      PLANNEDEND,
                      EXECUTIONSTART,
                      EXECUTIONEND,
                      STATUS, 
                      SOURCE, 
                      ACCOUNT_NAME
         FROM "_SYS_BIC"."cona-reporting.field-sales/Q_CA_R_SpringVisit" 
         WHERE VISITTYPE = ?'

param <- 'ZR'

df <- dbGetQuery(jdbcConnection, sql, param)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...