好的,这在过去的几个小时里严重伤害了我的大脑。你能否在Oracle中使用INSERT ALL和SELECT?
这是我得到的,它告诉我sql命令没有正确结束
INSERT ALL
INTO ENVIRONMENT (NAME, ID, DESCRIPTION, START_DATE, END_DATE) VALUES(:name, :eId, :description, :sDate, :eDate)
INTO ENVIRONMENT#URL (ID, ENVIRONMENT_ID, URL, URL_TYPE_ID) SELECT 600, :eId, :url, URL_TYPE.ID FROM URL_TYPE WHERE URL_TYPE.TYPE like :urlType
INTO ENVIRONMENT#CONTACT (ID, ENVIRONMENT_ID, CONTACT_ID) SELECT 600, :eId, CONTACT.ID FROM CONTACT WHERE CONTACT.NAME like :contactName
SELECT * FROM DUAL
这是使用php运行的,这就是为什么没有分号。如果它作为3个不同的插入语句运行但是它需要是一个查询,则它可以工作。我怎么可能这样做?
答案 0 :(得分:2)
我认为您必须在INSERT
部分之后删除INSERT ALL
个关键字,如下所示:
INSERT ALL
INTO ENVIRONMENT (NAME, ID, DESCRIPTION, START_DATE, END_DATE) VALUES(:name, :eId, :description, :sDate, :eDate)
INTO ENVIRONMENT#URL (ID, ENVIRONMENT_ID, URL, URL_TYPE_ID) SELECT 600, :eId, :url, URL_TYPE.ID FROM URL_TYPE WHERE URL_TYPE.TYPE like :urlType
INTO ENVIRONMENT#CONTACT (ID, ENVIRONMENT_ID, CONTACT_ID) SELECT 600, :eId, CONTACT.ID FROM CONTACT WHERE CONTACT.NAME like :contactName
SELECT * FROM DUAL
修改强>
你知道,现在我已经看了一些,我看到你有最后2个SELECT
条款的其他INTO
语句。我不认为INSERT ALL
语法允许这样做。我认为你必须对所有条款使用VALUES
。
就个人而言,我会尝试在这样的匿名PL / SQL块中包含3个普通INSERT ALL
语句,而不是使用INSERT
(不确定这是如何从PHP中运行的,我只是告诉你从Oracle的角度来看,这是一个声明,它工作正常):
BEGIN
INSERT INTO ENVIRONMENT (NAME, ID, DESCRIPTION, START_DATE, END_DATE) VALUES(:name, :eId, :description, :sDate, :eDate);
INSERT INTO ENVIRONMENT#URL (ID, ENVIRONMENT_ID, URL, URL_TYPE_ID) (SELECT 600, :eId, :url, URL_TYPE.ID FROM URL_TYPE WHERE URL_TYPE.TYPE like :urlType);
INSERT INTO ENVIRONMENT#CONTACT (ID, ENVIRONMENT_ID, CONTACT_ID) (SELECT 600, :eId, CONTACT.ID FROM CONTACT WHERE CONTACT.NAME like :contactName);
END;