插入表RODBC

插入表RODBC,r,oracle11g,rodbc,R,Oracle11g,Rodbc,我想将dataframe的内容插入到oracle数据库中的现有表中 sqlSave(conn, df[1:3,c(which(names(df) == "x"), which(names(df) == "y"), which(names(df) == "z")], tablename = "A_X", append = TRUE) 我在odbcUpdate(通道,查询,mydata,coldata[m,],test=test,)中得到错误error: 在»data«中缺少列,因为所选列与Or

我想将dataframe的内容插入到oracle数据库中的现有表中

sqlSave(conn, df[1:3,c(which(names(df) == "x"), which(names(df) == "y"), which(names(df) == "z")], tablename = "A_X", append = TRUE) 
我在odbcUpdate(通道,查询,mydata,coldata[m,],test=test,)中得到错误
error:
在»data«
中缺少列,因为所选列与Oracle表中的列不匹配

oracle表的列数大于数据框的列数,因此不匹配的列应填充NULL。我如何在R中实现这一点?我希望在底部的SQL代码中包含df的内容,如下所示:

 INSERT INTO A_X
              VALUES (df[1:3,c(which(names(df) == "x"), which(names(df) == "y"), which(names(df) == "z")], AUTO_ID, NULL,  NULL);
在Oracle SQL中,这可以通过以下代码实现:

INSERT INTO A_X
              VALUES (300, 'text', 'text', AUTO_ID, NULL,  NULL);

第二个问题是自动生成ID
AUTO\u ID
。我有Oracle DB 11.2.0.3版,目前无法更新到12c版。

这里是另一种方法

不要只使用
sqlSave
,而是使用
sqlSave
sqlQuery
fromRODBC
dbExecute
fromDBI的组合


然后,您可以将
df
作为永久表或临时表编写,然后使用
INSERT
UPDATE
语句将
sqlQuery
包装起来,以便对目标表和临时表进行操作。这不是很优雅,但即使将来模式发生变化,也应该为您提供一个可扩展的解决方案。

我认为R的期望值很可能是df模式与表模式相同。为什么不从DB中获得前5名左右,然后使用df上的列名和fill.na来解决这个问题。感谢这个想法。我考虑过这个问题,但我想在不修改df的情况下解决我的问题。如果不可能,我必须修改它虽然.sqlSave不起作用,因为我有类型为memo的字段。我不太明白你所说的
sqlSave
sqlQuery
的组合是什么意思。我尝试了
sqlSave(connection,df,tablename=“oracle_table”,append=TRUE)
并在odbcUpdate(channel,query,mydata,coldata[m,],test=test,:'Calloc'无法分配内存(1字节的18446744071562067968)不管错误是怎么说的,我不认为这是内存分配问题。你能分享你的数据集样本吗?它不一定是真实的数据,但要确保数据类型和字符串大小等反映了真实情况。你也应该在样本数据上得到同样的错误。我没有oracle DB,但我将尝试这个方法n sql server。我明天会这样做。我为这个问题打开了一个新的线程:我在新帖子中放了一个示例数据集。你能用sql server试试吗?