【发布时间】:2019-05-07 11:10:52
【问题描述】:
在我的原始线程中:How can I fix ORA: 01013 (user requested cancel...) when trying to link Oracle tables in MS Access? 我描述了一个试图将 Oracle 表链接到 Microsoft Access (office 365) 数据库的问题。输入 UID 和密码后进程超时。
在研究问题时,我能够确定 ODBC 驱动程序和 DSN 适用于 ADO、Toad 和 Microsoft Power BI(当对 Oracle 表使用特定查询时)。我无法从 Access 或 Excel 中记录 Oracle V$SQL 表中的条目以进一步解决问题。
但是,今晚,通过尝试通过 DSN 连接并浏览 Oracle 中的表,我能够让 Power BI 重新创建相同的行为。 Oracle 捕获了 SQL 调用,结果是这个 gem:
SELECT
*
FROM
(
SELECT
NULL table_qualifier,
o1.owner table_owner,
o1.object_name table_name,
DECODE(o1.owner, 'SYS', DECODE(o1.object_type, 'TABLE', 'SYSTEM TABLE', 'VIEW', 'SYSTEM VIEW', o1.object_type), 'SYSTEM'
, DECODE(o1.object_type, 'TABLE', 'SYSTEM TABLE', 'VIEW', 'SYSTEM VIEW', o1.object_type), o1.object_type) table_type,
NULL remarks
FROM
all_objects o1
WHERE
o1.object_type IN ('TABLE',
'VIEW'
)
UNION
SELECT
NULL table_qualifier,
s.owner table_owner,
s.synonym_name table_name,
'SYNONYM' table_type, null remarks
FROM
all_objects o3,
all_synonyms s
WHERE
o3.object_type IN (
'TABLE',
'VIEW'
)
AND s.table_owner = o3.owner
AND s.table_name = o3.object_name
UNION
SELECT
NULL table_qualifier,
s1.owner table_owner,
s1.synonym_name table_name,
'SYNONYM' table_type,
NULL remarks
FROM
all_synonyms s1
WHERE
s1.db_link IS NOT NULL
) tables
WHERE
1 = 1
AND ( table_type = 'TABLE'
OR table_type = 'VIEW' )
ORDER BY
4,
2,
3
我不知道从哪里开始这个查询。 union 语句中的第二个和第三个子查询被最后的 where 子句过滤掉了,所以没有用。第一个子查询试图从 all_objects 中检索表/模式列表。如果我将该 SQL 块限制为前 100,000 行并在 SQLPLUS 中运行,则在 Oracle 18c (XE) 中运行时间超过 20 分钟。我认为这是因为该对象在不断更新,即使查询正在运行。
Oracle 认证的 MS ODBC 规范的详细信息让我难以理解,所以我不知道是继续追究微软的票,还是将注意力转向 Oracle 作为问题的罪魁祸首。
任何和所有的建议表示赞赏。我真的需要知道哪一方负责上面的SQL。
谢谢!
【问题讨论】: