SQL 语句中缺少左括号的解决方法
Posted
技术标签:
【中文标题】SQL 语句中缺少左括号的解决方法【英文标题】:Unable to find solution about missing left parenthesis in SQL statement 【发布时间】:2019-08-08 15:03:35 【问题描述】:SQL Developer 说缺少左括号。
ORA-00906: 缺少左括号 00906. 00000 - “缺少左括号” *原因: *行动: 行错误:8 列:108
Oracle SQL
SELECT t.DSA_NAME as "DSA NAME",
t.REVISION as REVISION,
XMLTYPE(t.DSA_SOURCE).EXTRACT('//PreProcessor/statements/text()').getStringVal() AS "PreProcessor Temp Table",
XMLTYPE(t.DSA_SOURCE).EXTRACT('//PostProcessor/statements/text()').getStringVal() AS "PostProcessor Temp Table"
FROM
DSA_SOURCE t
where XMLCAST (XMLTYPE(t.DSA_SOURCE).EXTRACT('//PreProcessor/statements/text()').getStringVal() AS VARCHAR2) like '%create%temp%'
and t.REVISION IN (SELECT MAX(REVISION)
FROM DSA_SOURCE
GROUP BY DSA_NAME);
我曾尝试在 CAST 函数中使用 VARCHAR2(100)
而不是 VARCHAR
,但后来我低于 错误。
ORA-00932:不一致的数据类型:预期 - 得到 - 00932. 00000 - “不一致的数据类型:预期的 %s 得到了 %s” *原因:*行动:
【问题讨论】:
【参考方案1】:这个 *** 答案总结得很好 https://***.com/a/10197710/9822083
SELECT t.DSA_NAME as "DSA NAME",
t.REVISION as REVISION,
XMLTYPE(t.DSA_SOURCE).EXTRACT('//PreProcessor/statements/text()').getStringVal() AS "PreProcessor Temp Table",
XMLTYPE(t.DSA_SOURCE).EXTRACT('//PostProcessor/statements/text()').getStringVal() AS "PostProcessor Temp Table"
FROM
DSA_SOURCE t
where XMLCAST (XMLTYPE(t.DSA_SOURCE).EXTRACT('//PreProcessor/statements/text()').getStringVal() AS VARCHAR2(50)) like '%create%temp%'
and t.REVISION IN (SELECT MAX(REVISION)
FROM DSA_SOURCE
GROUP BY DSA_NAME);
VARCHAR2 是一种需要最大大小/长度的类型。 您缺少的左括号是围绕大小的括号。
【讨论】:
问题表明 OP 已经尝试过这个并且得到了一个不同的错误。【参考方案2】:正如@Jedo 所说,您需要指定varchar2
的大小;但是您在问题中提到您已经尝试过并得到“ORA-00932:不一致的数据类型”。那是因为您在 XMLCast()
调用中使用了 getStringValue()
,而它需要一个 XMLType。
where XMLCAST (XMLTYPE(t.DSA_SOURCE).EXTRACT('//PreProcessor/statements/text()').getStringVal() AS VARCHAR2(100)) like '%create%temp%'
要么坚持XMLCast()
:
where XMLCAST (XMLTYPE(t.DSA_SOURCE).EXTRACT('//PreProcessor/statements/text()') AS VARCHAR2(100)) like '%create%temp%'
或删除它,只使用getStringVal()
:
where XMLTYPE(t.DSA_SOURCE).EXTRACT('//PreProcessor/statements/text()').getStringVal() like '%create%temp%'
...但不是两者兼而有之。
您也可以使用 XMLQuery()
和 XMLExists()
执行此操作:
select t.dsa_name as "DSA NAME",
t.revision as revision,
xmlquery('//PreProcessor/statements/text()'
passing xmltype(t.dsa_source)
returning content) as "PreProcessor Temp Table",
xmlquery('//PostProcessor/statements/text()'
passing xmltype(t.dsa_source)
returning content) as "PostProcessor Temp Table"
from dsa_source t
where xmlexists('//PreProcessor/statements[matches(text(), ''create.*temp'')]'
passing xmltype(t.dsa_source))
and (t.dsa_name, t.revision) in (
select dsa_name, max(revision)
from dsa_source
group by dsa_name
);
我也修改了最后一个子句;使用您的版本,您会找到一个修订列表(所有名称中的所有最高修订),然后查找任何名称的任何修订。我已经对其进行了修改,以查找名称对和该名称的最大修订版本。
db<>fiddle(如图 18c 所示;这在 11gR2 版本(即 11.2.0.2)中不起作用,但在 11.2.0.4 及更高版本中起作用。)
如果dsa_source
是varchar2
,您可以通过使用分析函数避免两次查询表,但这不适用于clob
,因此可能没有帮助。
【讨论】:
以上是关于SQL 语句中缺少左括号的解决方法的主要内容,如果未能解决你的问题,请参考以下文章
Oracle Live SQL:ORA-00907:缺少右括号 -
ORACLE SQL 错误 - 缺少右括号 - 查询 [关闭]