我有功能,我必须添加 for update 子句。
FUNCTION FUNC_NAME(
strValues IN arrayofstrings)
RETURN arrayofnumbers IS
ids arrayofnumbers := arrayofnumbers();
BEGIN
SELECT myId BULK COLLECT INTO ids
FROM table_1
WHERE table_1.rownum1 IN (select column_value from table(strValues))
GROUP BY myId
HAVING count(*) = (select count(*) from table(strValues))
--for update of myId
;
RETURN ids;
END FUNC_NAME;
但如果删除评论,则错误
Error(26,7): PL/SQL: ORA-01786: FOR UPDATE of this query expression is not allowed
如何重建我的查询?
答案 0 :(得分:1)
您不能简单地使用public static int WritetoAccountsTable(string Comment, int PriorityInt, string filePath)
{
using (System.Data.SQLite.SQLiteConnection conn = new System.Data.SQLite.SQLiteConnection("data source=" + filePath + "; Synchronous=Off"))
{
using (System.Data.SQLite.SQLiteCommand cmd = new System.Data.SQLite.SQLiteCommand(conn))
{
conn.Open();
cmd.CommandText = @"INSERT INTO Accounts(Description,Priority)
values(@Comment,@PriorityInt)";
cmd.Parameters.AddWithValue("@Comment", Comment);
cmd.Parameters.AddWithValue("@PriorityInt", PriorityInt);
return cmd.ExecuteNonQuery();
}
}
}
使用for update
子句锁定表中的行。 group by
子句通过对指定列上的记录进行分组来提供表数据的整体视图,因此如果您锁定任何DML的行,它也没有意义。您可以使用如下方式锁定行。
<强>或者:强>
在示例中,我使用Oracle内置集合group by
。
sys.odcinumberlist
或强>
CREATE OR REPLACE FUNCTION FUNC_NAME (strValues IN SYS.odcinumberlist)
RETURN SYS.odcinumberlist
IS
ids SYS.odcinumberlist;
CURSOR fall_jobs_cur (strValues IN SYS.odcinumberlist)
IS
SELECT myId
FROM table_1
WHERE table_1.rownum1 IN (SELECT COLUMN_VALUE
FROM TABLE (strValues))
FOR UPDATE OF myId;
BEGIN
OPEN fall_jobs_cur (strValues);
FETCH fall_jobs_cur BULK COLLECT INTO ids;
RETURN ids;
END FUNC_NAME;
以上两个代码将被编译,但是当你执行它时,你将再次面临问题。
赞:
CREATE OR REPLACE FUNCTION FUNC_NAME (strValues IN SYS.odcinumberlist)
RETURN SYS.odcinumberlist
IS
ids SYS.odcinumberlist;
BEGIN
SELECT myId
BULK COLLECT INTO ids
FROM table_1
WHERE table_1.rownum1 IN (SELECT COLUMN_VALUE
FROM TABLE (strValues));
FOR UPDATE OF myId;
RETURN ids;
END FUNC_NAME;
所以我的问题是你真正想要实现的目标。