我目前正在尝试创建漂亮且快速运行的SQL命令,并找到了一些我无法解释的内容。
导致问题的SQL代码:
INSERT INTO FIELD_TYPE (FIELD_TYPE_ID, FIELD_VALUE_TYPE_ID, CREATOR)
SELECT :p0, :p1, :p2 FROM DUAL
UNION ALL
SELECT :p3, :p4, :p5 FROM DUAL
UNION ALL
SELECT :p6, :p7, :p8 FROM DUAL
UNION ALL
SELECT NULL, NULL, NULL FROM DUAL WHERE 1 = 0
解释
FIELD_TYPE_ID NUMBER NOT NULL
(PK)
FIELD_VALUE_TYPE NUMBER NOT NULL
CREATOR NUMBER NOT NULL
(FK)
我的问题:
我的C#应用程序获取要插入的项目数组。对于每个项目,我添加了SELECT
和UNION ALL
,如上所示。
最后一步是添加SELECT NULL, NULL, NULL FROM DUAL WHERE 1 = 0
,以便在没有要插入的项目传递给方法时没有语法错误。
如果不添加emtpy集的选择,一切都像魅力一样。
一旦我添加了emtpy集的选择,命令的执行就会永远执行。我的第一个猜测是使用NULL
可能是一个问题,但我不完全确定。
任何人都可以解释这种行为吗?我能以聪明的方式避免这种情况吗?
上面显示的代码是在基类中生成的,该基类不知道要插入的表的列类型。如果这是我的问题的原因,这使得很难确定要使用的默认值而不是NULL
。
我使用的是来自NuGet的ORACLE Managed DataAccess(ODP)和一个ORACLE 11g DB。
不会帮助我的常见答案:)