我正在尝试使用SELECT插入表中,然后检索插入记录的ID。
当我将查询复制/粘贴时,减去其ID检索部分,到SQL Developer中,它可以正常工作。所以ID检索部分出了问题,我看不到问题。
这是我在SQL开发人员中使用的内容,它插入:
INSERT INTO TABLE1 (TABLE1_ID,COL1, COL2, ..., COLn)
SELECT 0, COL1, COL2, ..., COLn,
FROM TABLE2
WHERE SOME_ID = 16;
C#中的相同查询,带有ID检索部分:
int iOutID = -1;
string sQuery = "INSERT INTO TABLE1 (TABLE1_ID,COL1, COL2, ..., COLn) " +
"SELECT 0, COL1, COL2, ..., COLn, " +
"FROM TABLE2 " +
"WHERE SOME_ID = 16 " +
"RETURNING TABLE1_ID INTO :OutID";
dbContext.Open();
List<OracleParameter> spParams = new List<OracleParameter>();
OracleParameter outParam = new OracleParameter("OutID", OracleDbType.Decimal, System.Data.ParameterDirection.Output);
spParams.Add(outParam);
dbContext.ExecuteOraNonQuery(sQuery, spParams, ref iOutID);
iOutID= int.Parse(outParam.Value.ToString());
引发异常
"ORA-00933: SQL command not properly ended".
更新
根据建议使用修改后的查询以使用第一行:
string sQuery = "INSERT INTO TABLE1 (TABLE1_ID,COL1, COL2, ..., COLn) " +
"SELECT 0, COL1, COL2, ..., COLn FROM ("
"SELECT 0, COL1, COL2, ..., COLn, " +
"FROM TABLE2 " +
"WHERE SOME_ID = 16 " +
"ORDER BY Some_Date DESC) " +
"WHERE ROWNUM = 1 " +
"RETURNING TABLE1_ID INTO :OutID";
我认为是因为您的第一个示例可以插入多行。
一旦您说您只想返回一个ID,就会变成错误-Oracle有助于防止您编写错误的SQL。
将ROWNUM = 1
添加到WHERE子句有帮助吗?