0

我有一个很长的 SQL 语句,本质上是:

with a as (select * from t1),  
  b as (select * from a, t2 where a.id=t2.id)  
select * from b

该语句在我的 TOAD 应用程序中执行得非常好。但是,当我尝试将上述内容填充到字符串变量中并使用以下命令在 ASP 中运行它时:

set rs = objConn.execute(strSQL)

我收到以下错误:
Microsoft OLE DB Provider for ODBC Drivers error '80040e37'
[Microsoft][ODBC driver for Oracle][Oracle]ORA-00942: table or view does not exist
/Application/xxxxx/yyyyy/myfilename.asp,第 168 行

第 168 行是 set rs = objConn.execute(strSQL) 行。

我已经使用这些相同的表来运行其他几个查询,并使用 set rs = objConn.execute(strSQL) 行将它们在线发布,没有任何问题。我唯一能确定的与此 SQL 查询不同的是子查询分解。

我尝试将整个查询包装在它自己的选择语句中,例如:

select * from (with a as blah blah... entire original query)

但这仍然会引发相同的错误。我可以不使用 set

rs = objConn.execute(strSQL) 

结合子查询分解?不支持吗?或者有什么解决办法?或者它可能完全是别的东西?

谢谢。

4

2 回答 2

1

我真笨。将 select * from () 包裹在整个块周围确实有效。我的错误被抛出,因为我忘记了我正在尝试加入一个旧的(不再使用的)表,该表实际上位于我未连接到的不同模式中。我通过重写查询以将一些需要的数据从那个晦涩的表中提取到另一个我连接到并包含我需要的相同数据的表中来解决了这个问题。

于 2014-05-23T13:26:10.313 回答
0

用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序非常旧。它是在 Oracle 7 出现时创建的,从那以后就没有真正更新过。在 Oracle 9.2 中添加了 WITH 子句。

我很惊讶你的select * from ()解决方法不起作用。这正是我们正在使用的,它对我们来说工作得很好。

另一种解决方案是使用Oracle Provider for OLE DB代替 Microsoft 驱动程序。它由 Oracle 提供,并随每个 Oracle 版本更新。

于 2014-05-22T19:52:17.460 回答