Прочетете в CLOB обекти в R като стойност на низ

Търся да прочета данните, които се съхраняват като CLOB стойност в моята база данни на Oracle. Съдържанието е просто HTML, който изобразява имейлите, които изпращаме чрез нашето CRM приложение. Искам да пресъздам изображения на имейла, които да включа в отчетите си за ефективността на crm.

Мога успешно да прочета данните в SPSS с помощта на следната заявка, която преобразува CLOB в низ с дължина (32750).

GET DATA
  /TYPE=ODBC
  /CONNECT='DSN=<MYDSN>;UID=<USER>;PWD=mypassword;Host=myhost;Port=myport;SID='+
    'SID'
  /SQL='SELECT *  FROM mytable'
  /ASSUMEDSTRWIDTH=32750.
CACHE.
EXECUTE.
DATASET NAME clob_query WINDOW=FRONT.

Това, което искам да направя, е да изпълня подобна заявка, но да прочета данните в R. Опитах следната заявка и получих грешката по-долу:

> SQL <-"SELECT to_char(CONTENT) as content from REL_EMAIL_TEMPLATE"
> ds <- sqlQuery(ch, SQL, as.is=T, stringsAsFactors=F)
> ds
[1] "HY000 22835 [Oracle][ODBC][Ora]ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 5923, maximum: 4000)\n"
[2] "[RODBC] ERROR: Could not SQLExecDirect 'SELECT to_char(CONTENT) as content from REL_EMAIL_TEMPLATE'"   

Не съм сигурен как мога да направя "буфера" по-голям, но смятам, че тъй като постигам това в SPSS, R трябва да може да прави и това.

Много благодаря предварително.


person Btibert3    schedule 31.08.2012    source източник


Отговори (2)


Имам чувството, че трябва да съм опитал това решение, преди да публикувам, но се върнах към този проблем и успях да го пусна.

Единствената разлика този път е, че се опитах да изтегля само 1 запис в R с помощта на клауза WHERE.

Ето моето запитване:

SQL <- "SELECT TO_CHAR(CONTENT) FROM RELATEMGR.REL_EMAIL_TEMPLATE WHERE primary_key = 1"
body <- sqlQuery(ch, SQL, stringsAsFactors=F)

Странно. Не съм сигурен дали друга версия на R също има значение, но поне това ме отведе там, където трябваше да бъда.

Само за пълнота:

> sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: i386-pc-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RODBC_1.3-6

loaded via a namespace (and not attached):
[1] tools_2.15.0
person Btibert3    schedule 15.11.2012

Опитайте това, мисля, че TO_CHAR MAX размерът е 4000:

"SELECT dbms_lob.substr(CONTENT, 32767, 1 ) AS content FROM REL_EMAIL_TEMPLATE"
person DARK_A    schedule 31.08.2012
comment
Благодаря, опитах това и получих друга грешка. Разрових се из мрежата и промених вашата заявка по-горе да бъде 50 000 вместо 32767. Това доведе до валидна заявка, но всички върнати данни бяха NA, което знам, че не е така. - person Btibert3; 31.08.2012
comment
[1] HY000 6502 [Oracle][ODBC][Ora]ORA-06502: PL/SQL: числова или стойностна грешка: символен низов буфер е твърде малък\nORA-06512: на ред 1\n [2] [RODBC] ГРЕШКА: Не може SQLExecDirect 'SELECT dbms_lob.substr(CONTENT, 32767, 1 ) като съдържание от REL_EMAIL_TEMPLATE' - person Btibert3; 31.08.2012