访问 VBA 以导入 Oracle Table:ODBC--调用失败
Access VBA to Import Oracle Table: ODBC--Call Failed
我在 Access 2007 中编写了一个 VBA 代码到 运行 Oracle 上的 SQL 查询,并使用传递查询将结果插入到 Access table .我收到以下错误:“ODBC--Call Failed”。下面是代码:
If TableExists("" & TblName) = True Then DoCmd.DeleteObject acTable, TblName
CurrentDb.Execute "CREATE TABLE " & TblName & "(Merch_Nbr Text, Month_End_Date Text, Passer Text, PasserMonth Text, Volume Long, DiscountRevenue Long)"
'Create a Pass through query to extract MID List from Oracle table
Dim PassThruQuery As QueryDef
If QueryExists("Query_oracle") = True Then DoCmd.DeleteObject acQuery, "Query_oracle"
Set PassThruQuery = CurrentDb.CreateQueryDef("Query_oracle")
'SQL query to be executed on Oracle database
sql_stmt = "SELECT M.MERCH_NBR as Merch_Nbr,CM.MONTH_END_DATE as Month_End_Date,PSR.PASSER as Passer,PSR.MONTH as PasserMonth,sum(F.MERCH_BILLED_ASSESSMENTS) as Assessments,"
sql_stmt = sql_stmt & "sum(F.SALES_VOLUME-F.RETURNS_VOLUME) as Volume,sum(F.DISCOUNT_REVENUE) as DiscountRevenue "
sql_stmt = sql_stmt & "FROM WH_TARGET.RPSI_MONETARY_FACT F,WH_TARGET.RPSI_MERCHANT_DIM M,WH_TARGET.RPSI_CARD_TYPE_CHARGE_TYPE_DIM CT"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_PRICING_CATEGORY_DIM PC,WH_TARGET.RPSI_CALENDAR_MONTH_DIM CM,WH_TARGET.RPSI_BACK_END_VENDOR_DIM BEV"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_SALES_GROUP_DIM SG_H,WH_TARGET.RPSI_SALES_REP_DIM SR_H,WH_TARGET.RPSI_AGENT_BANK_DIM AB_H"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_ASSOCIATION_DIM ASSC_H,WH_TARGET.RPSI_SALES_GROUP_DIM SG_C,WH_TARGET.RPSI_SALES_REP_DIM SR_C"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_AGENT_BANK_DIM AB_C,WH_TARGET.RPSI_ASSOCIATION_DIM ASSC_C,dw_biz.portfolio_mgmt PSR "
sql_stmt = sql_stmt & "WHERE Month_End_Date >= '01-OCT-2014' AND PSR.MONTH = '01-JAN-2015' "
sql_stmt = sql_stmt & "AND psr.TYPE = 'MON' AND CT.CARD_TYPE in ('1','2','5') AND PSR.MID = M.MERCH_NBR "
sql_stmt = sql_stmt & "AND F.MERCHANT_SID_FK = M.MERCHANT_SID_PK AND F.CARD_TYPE_CHARGE_TYPE_SID_FK = CT.CARD_TYPE_CHARGE_TYPE_SID_PK "
sql_stmt = sql_stmt & "AND F.PRICING_CATEGORY_SID_FK = PC.PRICING_CATEGORY_SID_PK AND F.CALENDAR_MONTH_SID_FK = CM.CALENDAR_MONTH_SID_PK "
sql_stmt = sql_stmt & "AND F.BACK_END_VENDOR_SID_FK = BEV.BACK_END_VENDOR_SID_PK AND F.SALES_GROUP_SID_FK = SG_H.SALES_GROUP_SID_PK "
sql_stmt = sql_stmt & "AND F.SALES_REP_SID_FK = SR_H.SALES_REP_SID_PK AND F.AGENT_BANK_SID_FK = AB_H.AGENT_BANK_SID_PK "
sql_stmt = sql_stmt & "AND F.ASSOCIATION_SID_FK = ASSC_H.ASSOCIATION_SID_PK AND M.SALES_GROUP_SID_FK = SG_C.SALES_GROUP_SID_PK "
sql_stmt = sql_stmt & "AND M.SALES_REP_SID_FK = SR_C.SALES_REP_SID_PK AND M.AGENT_BANK_SID_FK = AB_C.AGENT_BANK_SID_PK "
sql_stmt = sql_stmt & "AND M.ASSOCIATION_SID_FK = ASSC_C.ASSOCIATION_SID_PK "
sql_stmt = sql_stmt & "GROUP BY M.MERCH_NBR,CM.MONTH_END_DATE,PSR.PASSER,PSR.MONTH"
PassThruQuery.SQL = sql_stmt
PassThruQuery.Connect = "ODBC;DSN=RDW1;UID=dw_biz;PWD=dw_biz"
PassThruQuery.ReturnsRecords = True
'Insert the Query results into Access Table
CurrentDb.Execute "INSERT INTO " & TblName & "(Merch_Nbr, Month_End_Date, Passer, PasserMonth, Volume, DiscountRevenue) " & _
"SELECT Query_oracle.Merch_Nbr, Query_oracle.Month_End_Date, Query_oracle.Passer, Query_oracle.PasserMonth, Query_oracle.Volume, Query_oracle.DiscountRevenue From Query_oracle;"
Exit Sub
我将此查询导出到一个文本文件并 运行 它在 Oracle 上,运行 没问题!此外,我使用上述 SQL 查询在 Oracle 上创建了一个临时 table,并将 VBA 中的 sql_stmt 替换为 "select * from new_oracle_table"。 St运行gely,这似乎也工作正常。您认为这与 sql_stmt 本身中 SQL 查询的长度有关吗?非常感谢任何关于如何解决此问题的想法。
-SS
我能够解决这个错误。只需将下面的代码复制到您的错误处理程序中,它就会为您提供 ODBC 的更详细描述——调用失败错误
'DAO Error Handler
Dim MyError As Error
Debug.print Errors.Count
For Each MyError In DBEngine.Errors
With MyError
MsgBox .Number & " " & .Description
End With
Next MyError
这告诉我,由于 SQL 查询的大小过大,我的 ODBC 连接已超时。只需按照下面 link 中的步骤解决错误。
我在 Access 2007 中编写了一个 VBA 代码到 运行 Oracle 上的 SQL 查询,并使用传递查询将结果插入到 Access table .我收到以下错误:“ODBC--Call Failed”。下面是代码:
If TableExists("" & TblName) = True Then DoCmd.DeleteObject acTable, TblName
CurrentDb.Execute "CREATE TABLE " & TblName & "(Merch_Nbr Text, Month_End_Date Text, Passer Text, PasserMonth Text, Volume Long, DiscountRevenue Long)"
'Create a Pass through query to extract MID List from Oracle table
Dim PassThruQuery As QueryDef
If QueryExists("Query_oracle") = True Then DoCmd.DeleteObject acQuery, "Query_oracle"
Set PassThruQuery = CurrentDb.CreateQueryDef("Query_oracle")
'SQL query to be executed on Oracle database
sql_stmt = "SELECT M.MERCH_NBR as Merch_Nbr,CM.MONTH_END_DATE as Month_End_Date,PSR.PASSER as Passer,PSR.MONTH as PasserMonth,sum(F.MERCH_BILLED_ASSESSMENTS) as Assessments,"
sql_stmt = sql_stmt & "sum(F.SALES_VOLUME-F.RETURNS_VOLUME) as Volume,sum(F.DISCOUNT_REVENUE) as DiscountRevenue "
sql_stmt = sql_stmt & "FROM WH_TARGET.RPSI_MONETARY_FACT F,WH_TARGET.RPSI_MERCHANT_DIM M,WH_TARGET.RPSI_CARD_TYPE_CHARGE_TYPE_DIM CT"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_PRICING_CATEGORY_DIM PC,WH_TARGET.RPSI_CALENDAR_MONTH_DIM CM,WH_TARGET.RPSI_BACK_END_VENDOR_DIM BEV"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_SALES_GROUP_DIM SG_H,WH_TARGET.RPSI_SALES_REP_DIM SR_H,WH_TARGET.RPSI_AGENT_BANK_DIM AB_H"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_ASSOCIATION_DIM ASSC_H,WH_TARGET.RPSI_SALES_GROUP_DIM SG_C,WH_TARGET.RPSI_SALES_REP_DIM SR_C"
sql_stmt = sql_stmt & ",WH_TARGET.RPSI_AGENT_BANK_DIM AB_C,WH_TARGET.RPSI_ASSOCIATION_DIM ASSC_C,dw_biz.portfolio_mgmt PSR "
sql_stmt = sql_stmt & "WHERE Month_End_Date >= '01-OCT-2014' AND PSR.MONTH = '01-JAN-2015' "
sql_stmt = sql_stmt & "AND psr.TYPE = 'MON' AND CT.CARD_TYPE in ('1','2','5') AND PSR.MID = M.MERCH_NBR "
sql_stmt = sql_stmt & "AND F.MERCHANT_SID_FK = M.MERCHANT_SID_PK AND F.CARD_TYPE_CHARGE_TYPE_SID_FK = CT.CARD_TYPE_CHARGE_TYPE_SID_PK "
sql_stmt = sql_stmt & "AND F.PRICING_CATEGORY_SID_FK = PC.PRICING_CATEGORY_SID_PK AND F.CALENDAR_MONTH_SID_FK = CM.CALENDAR_MONTH_SID_PK "
sql_stmt = sql_stmt & "AND F.BACK_END_VENDOR_SID_FK = BEV.BACK_END_VENDOR_SID_PK AND F.SALES_GROUP_SID_FK = SG_H.SALES_GROUP_SID_PK "
sql_stmt = sql_stmt & "AND F.SALES_REP_SID_FK = SR_H.SALES_REP_SID_PK AND F.AGENT_BANK_SID_FK = AB_H.AGENT_BANK_SID_PK "
sql_stmt = sql_stmt & "AND F.ASSOCIATION_SID_FK = ASSC_H.ASSOCIATION_SID_PK AND M.SALES_GROUP_SID_FK = SG_C.SALES_GROUP_SID_PK "
sql_stmt = sql_stmt & "AND M.SALES_REP_SID_FK = SR_C.SALES_REP_SID_PK AND M.AGENT_BANK_SID_FK = AB_C.AGENT_BANK_SID_PK "
sql_stmt = sql_stmt & "AND M.ASSOCIATION_SID_FK = ASSC_C.ASSOCIATION_SID_PK "
sql_stmt = sql_stmt & "GROUP BY M.MERCH_NBR,CM.MONTH_END_DATE,PSR.PASSER,PSR.MONTH"
PassThruQuery.SQL = sql_stmt
PassThruQuery.Connect = "ODBC;DSN=RDW1;UID=dw_biz;PWD=dw_biz"
PassThruQuery.ReturnsRecords = True
'Insert the Query results into Access Table
CurrentDb.Execute "INSERT INTO " & TblName & "(Merch_Nbr, Month_End_Date, Passer, PasserMonth, Volume, DiscountRevenue) " & _
"SELECT Query_oracle.Merch_Nbr, Query_oracle.Month_End_Date, Query_oracle.Passer, Query_oracle.PasserMonth, Query_oracle.Volume, Query_oracle.DiscountRevenue From Query_oracle;"
Exit Sub
我将此查询导出到一个文本文件并 运行 它在 Oracle 上,运行 没问题!此外,我使用上述 SQL 查询在 Oracle 上创建了一个临时 table,并将 VBA 中的 sql_stmt 替换为 "select * from new_oracle_table"。 St运行gely,这似乎也工作正常。您认为这与 sql_stmt 本身中 SQL 查询的长度有关吗?非常感谢任何关于如何解决此问题的想法。
-SS
我能够解决这个错误。只需将下面的代码复制到您的错误处理程序中,它就会为您提供 ODBC 的更详细描述——调用失败错误
'DAO Error Handler
Dim MyError As Error
Debug.print Errors.Count
For Each MyError In DBEngine.Errors
With MyError
MsgBox .Number & " " & .Description
End With
Next MyError
这告诉我,由于 SQL 查询的大小过大,我的 ODBC 连接已超时。只需按照下面 link 中的步骤解决错误。