Sql 为什么我的查询中的count(不同的签名者id)会导致ORA-00600错误?

Sql 为什么我的查询中的count(不同的签名者id)会导致ORA-00600错误?,sql,oracle,Sql,Oracle,这就是错误所在: CREATE OR REPLACE FORCE VIEW "EXPCPU_SVS"."TEMP_VW_ZZZ_SVS_DATA_IMPORT" ("ACCOUNT_TYPE", "TOTAL_ACCOUNTS", "TOTAL_SIGNATURES", "TOTAL_SIGNCARDS", "TOTAL_GROUPS", "TOTAL_RULES") AS SELECT flag_name AS ACCOUNT_TYPE, NVL(TOTAL_ACCOU

这就是错误所在:

CREATE OR REPLACE FORCE VIEW "EXPCPU_SVS"."TEMP_VW_ZZZ_SVS_DATA_IMPORT" ("ACCOUNT_TYPE", "TOTAL_ACCOUNTS", "TOTAL_SIGNATURES", "TOTAL_SIGNCARDS", "TOTAL_GROUPS", "TOTAL_RULES") AS 
SELECT flag_name            AS ACCOUNT_TYPE,
NVL(TOTAL_ACCOUNTS,0)       AS TOTAL_ACCOUNTS,
NVL(TOTAL_SIGNATURES,0)     AS TOTAL_SIGNATURES,
NVL(TOTAL_SIGNCARDS,0)      AS TOTAL_SIGNCARDS,
NVL(TOTAL_GROUPS,0)         AS TOTAL_GROUPS,
NVL(TOTAL_RULES,0)          AS TOTAL_RULES
FROM
(
SELECT flag_name,TOTAL_ACCOUNTS, TOTAL_SIGNATURES,TOTAL_SIGNCARDS,TOTAL_GROUPS,FLAG_VALUE FROM
(
SELECT flag_name,TOTAL_ACCOUNTS, TOTAL_SIGNATURES,TOTAL_SIGNCARDS,FLAG_VALUE FROM 
(
SELECT flag_name,TOTAL_ACCOUNTS,  TOTAL_SIGNATURES,flag_value
FROM 
(
SELECT flag_name,TOTAL_ACCOUNTS,flag_value 
FROM 
(
SELECT count(*)             AS TOTAL_ACCOUNTS ,
A.HISTORY_FLAG              AS a_history_flag
FROM tbl_sign_account a WHERE a.history_flag IN(0,1,2) GROUP BY a.history_flag
)
FULL OUTER JOIN
(
SELECT flag_value,flag_name FROM temp_zz_tbl_flag_mapping
)
ON flag_value=a_history_flag
)
FULL OUTER JOIN 
(
SELECT COUNT(*)             AS TOTAL_SIGNATURES,
b.history_flag              AS b_history_flag
FROM tbl_signatory b
WHERE b.history_flag IN (0,1,2)
GROUP BY b.history_flag
)
ON b_history_flag=flag_value )
FULL OUTER JOIN
(
SELECT count(distinct signatory_id)             AS TOTAL_SIGNCARDS ,
c.history_flag              AS c_history_flag
FROM  tbl_signature_card c
WHERE c.history_flag IN (0,1,2) GROUP BY c.history_flag
)
ON flag_value=c_history_flag
)FULL OUTER JOIN
(
SELECT count(*)             AS TOTAL_GROUPS,
d.history_flag              AS d_history_flag
FROM tbl_sign_group d
WHERE d.history_flag IN (0,1,2) GROUP BY d.history_flag
)
ON flag_value=d_history_flag
) 
FULL OUTER JOIN
(
SELECT count(*)             AS TOTAL_RULES,
e.history_flag              AS e_history_flag
FROM tbl_sign_rule e WHERE e.history_flag IN (0,1,2) GROUP BY e.history_flag
)
ON e_history_flag=flag_value;

ORA-00600意味着您遇到了一个内部错误,本质上是一个bug。您可以在My Oracle Support上查找错误的详细信息;有一个关于ORA-00600错误的通用文档,搜索参数
kkqcscpopn_Int
将显示各种已知问题-有关摘要,请参阅文档ID 1267257.1。您需要知道确切的版本和补丁级别,以缩小可能性,如果找不到匹配项或怀疑看到的是相同的内容,则需要提出服务请求。正如错误消息所说,报告错误是发生内部错误时的预期操作

有时,可以通过重写或重新设计正在使用的查询来避免隐藏的bug。在这种情况下,您所做的似乎过于复杂了——不确定为什么要添加这么多级别的查询,或者是否真的需要完整的外部联接。如果您想坚持连接到计算计数(而不是,比方说,在选择列表中有子查询),您可以尝试稍微简化一下,看看这是否有助于解析器。首先,假设您在
temp_zz_tbl_flag_mapping
中始终有您正在使用的三个标志值的记录,我认为这大致相同:

ORA-00600: internal error code, arguments: [kkqcscpopn_Int: 0], [], [], [], [], [], [], [], [], [], [], []
00600. 00000 -  "internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]"
*Cause:    This is the generic internal error number for Oracle program
           exceptions.  This indicates that a process has encountered an
           exceptional condition.
*Action:   Report as a bug - the first argument is the internal error number
如果该表/视图中可能没有所有的标志值,则可能需要返回到完整的外部联接,但即使如此,删除嵌套的内联视图也可能会有所不同


也可能不是;我无法在任何可用的DB版本中产生错误,因此我无法检查这是否可以避免错误。你必须做一些测试和实验。如果您将其简化为对数据和规则有意义的最简单形式,但仍然会出现错误,则必须获得Oracle的帮助。

“Oracle崩溃”?您能详细说明一下错误消息等吗?我只是添加了错误日志,对此表示抱歉。@Ollie我添加了错误日志返回了一个错误-您的查询可能已“崩溃”,但肯定不是Oracle本身……您是否看到了“报告为错误”部分?如果您有权访问我的Oracle支持,您可以进行搜索,查看是否存在已知问题,并可能找到解决方法。(首先请参见注释1267257.1)。当然,您仍然需要访问权限才能提出服务请求。你也可以尝试重写它-看起来它可以大大简化。谢谢@alex做得很好。
CREATE OR REPLACE  VIEW temp_vw_zzz_svs_data_import AS
SELECT z.flag_name           AS account_type,
  NVL(a.total_accounts, 0)   AS total_accounts,
  NVL(b.total_signatures, 0) AS total_signatures,
  NVL(c.total_signcards, 0)  AS total_signcards,
  NVL(d.total_groups, 0)     AS TOTAL_GROUPS,
  NVL(e.total_rules, 0)      AS TOTAL_RULES
FROM temp_zz_tbl_flag_mapping z
LEFT JOIN (
  SELECT history_flag, COUNT(*) AS total_accounts
  FROM tbl_sign_account
  GROUP BY history_flag
) a ON a.history_flag = z.flag_value
LEFT JOIN (
  SELECT history_flag, COUNT(*) AS total_signatures
  FROM tbl_signatory
  GROUP BY history_flag
) b ON b.history_flag = z.flag_value
LEFT JOIN (
  SELECT history_flag, COUNT(DISTINCT signatory_id) AS total_signcards
  FROM tbl_signature_card
  GROUP BY history_flag
) c ON c.history_flag = z.flag_value
LEFT JOIN (
  SELECT history_flag, COUNT(*) AS total_groups
  FROM tbl_sign_group
  GROUP BY history_flag
) d ON d.history_flag = z.flag_value
LEFT JOIN (
  SELECT history_flag, COUNT(*) AS total_rules
  FROM tbl_sign_rule
  GROUP BY history_flag
) e ON e.history_flag = z.flag_value
WHERE z.flag_value in (0,1,2);