Oracle CASE语句报ORA-00923错误,SQL Dev正常但代码调用失败
ORA-00923错误:NHibernate Formula中Oracle查询的别名问题
我编写了如下Oracle查询语句:
SELECT CASE WHEN P.ORGINAL_PROSJEKT_K IS NULL THEN RAD_LAGER ELSE ( SELECT PO.RAD_LAGER FROM PROSJEKT PO WHERE PO.PROSJEKT_K = P.ORGINAL_PROSJEKT_K ) END AS RAD_LAGER_ORIGINAL FROM PROSJEKT P WHERE P.PROSJEKT_K = PROSJEKT_K;
这条语句在SQL Developer中可正常执行,但通过C#代码调用时触发InnerException: ORA-00923 FROM keyword not found where expected错误。我尝试过给别名RAD_LAGER_ORIGINAL加引号、修改别名不含下划线,但均无效。
我使用NHibernate进行映射,相关代码如下:
Map(x => x.ProsjektLagetAv).Formula(@"(SELECT CASE WHEN P.ORGINAL_PROSJEKT_K IS NULL THEN RAD_LAGER ELSE (SELECT PO.RAD_LAGER FROM PROSJEKT PO WHERE PO.PROSJEKT_K = P.ORGINAL_PROSJEKT_K) END AS RAD_LAGER_ORIGINAL FROM PROSJEKT P WHERE P.PROSJEKT_K = PROSJEKT_K)");
实体构造代码:
[DataMember] public virtual string ProsjektLagetAv { get; set; } // PROSJEKT_K参数始终已提供且不为空。 Map(x => x.ProsjektK, "PROSJEKT_K"); [DataMember] public virtual string ProsjektK { get; set; }
解决方法
NHibernate在映射时存在特殊处理,无法识别带别名的子查询结构,移除别名AS RAD_LAGER_ORIGINAL后问题解决,修改后的查询语句如下:
SELECT CASE WHEN P.ORGINAL_PROSJEKT_K IS NULL THEN RAD_LAGER ELSE ( SELECT PO.RAD_LAGER FROM PROSJEKT PO WHERE PO.PROSJEKT_K = P.ORGINAL_PROSJEKT_K ) END FROM PROSJEKT P WHERE P.PROSJEKT_K = PROSJEKT_K;
内容的提问来源于stack exchange,提问作者s1dda
相关产品推荐
相关产品推荐

