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_sourcevarchar2,您可以通过使用分析函数避免两次查询表,但这不适用于clob,因此可能没有帮助。

【讨论】:

以上是关于SQL 语句中缺少左括号的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00907: 两个子查询的左连接缺少右括号

PHP CI框架中 怎么在->like中添加括号?

Oracle Live SQL:ORA-00907:缺少右括号 -

ORACLE SQL 错误 - 缺少右括号 - 查询 [关闭]

在导入JAVA项目缺少JAR包,但是代码里面没有错误提示?如何解决

setTimeOut(),和setInterVal()调用函数加不加括号!!!