插入带有 WHERE 子句的存储过程
Insert Stored Procedure with WHERE clause
我有一个 Oracle 10g 的存储过程需要在 table 中创建一个新行而不是创建重复项。
table 允许重复,只要所有列不相同即可。这是因为最后两列的值可能不同。
话虽如此,当我尝试存储我的过程时,我得到以下标志:
Line # = 10 Column # = 1 Error Text = PL/SQL: SQL Statement ignored
Line # = 13 Column # = 3 Error Text = PL/SQL: ORA-00933: SQL command not properly ended
这个过程看起来不错[假设我之前没有像这样为插入添加 WHERE 子句]。
所以要么我的格式不正确,要么我的逻辑不对。
不管是什么情况,我都尝试在网上和 Whosebug 上查找示例,但都失败了。
关于我应该如何调整这个有什么建议吗?
(val_ID tablename.column1%type,
val_cat tablename.column2%type,
val_sub tablename.column3%type
)
AS
BEGIN
INSERT INTO tablename (column1, column2, column3)
VALUES (val_ID, val_cat, val_sub)
WHERE ((column1 != val_ID) and (column2 != val_cat) and (column3 != val_sub));
COMMIT;
END;
我什至删除了 WHERE 子句中的“(”,没有任何改变。
更新:
尝试了这个建议,所有错误都消失了[但是没有创建记录]
(val_ID tablename.column1%type,
val_cat tablename.column2%type,
val_sub tablename.column3%type
)
AS
BEGIN
INSERT INTO tablename (column1, column2, column3)
SELECT val_ID, val_cat, val_sub
FROM dual
MINUS
SELECT val_ID, val_cat, val_sub
FROM tablename;
insert
语句没有 where
子句。不过,您可以通过使用 insert-select 语句来模拟它:
INSERT INTO tablename (column1, column2, column3)
SELECT val_ID, val_cat, val_sub
FROM dual
MINUS
SELECT column1, column2, column3
FROM tablename;
@Mureinik 的例子确实否定了我所有的错误;但是,在测试时它没有创建新行。
所以我目前的解决方法是 VB.net 中的一个查询,检查该值是否存在,然后实现一个简单的插入存储过程:
//Make select statement and look at table for whether more than 0 rows shows up. If 0 rows, then execute stored procedure
If DsAds1.Tables(0).Rows.Count = 0 Then
...do stored procedure
End If
存储过程
(val_ID tablename.column1%type,
val_cat tablename.column2%type,
val_sub tablename.column3%type
)
AS
BEGIN
INSERT INTO tablename (column1, column2, column3)
VALUES( val_ID, val_cat, val_sub);
COMMIT;
END;
我有一个 Oracle 10g 的存储过程需要在 table 中创建一个新行而不是创建重复项。
table 允许重复,只要所有列不相同即可。这是因为最后两列的值可能不同。
话虽如此,当我尝试存储我的过程时,我得到以下标志:
Line # = 10 Column # = 1 Error Text = PL/SQL: SQL Statement ignored
Line # = 13 Column # = 3 Error Text = PL/SQL: ORA-00933: SQL command not properly ended
这个过程看起来不错[假设我之前没有像这样为插入添加 WHERE 子句]。
所以要么我的格式不正确,要么我的逻辑不对。 不管是什么情况,我都尝试在网上和 Whosebug 上查找示例,但都失败了。
关于我应该如何调整这个有什么建议吗?
(val_ID tablename.column1%type,
val_cat tablename.column2%type,
val_sub tablename.column3%type
)
AS
BEGIN
INSERT INTO tablename (column1, column2, column3)
VALUES (val_ID, val_cat, val_sub)
WHERE ((column1 != val_ID) and (column2 != val_cat) and (column3 != val_sub));
COMMIT;
END;
我什至删除了 WHERE 子句中的“(”,没有任何改变。
更新:
尝试了这个建议,所有错误都消失了[但是没有创建记录]
(val_ID tablename.column1%type,
val_cat tablename.column2%type,
val_sub tablename.column3%type
)
AS
BEGIN
INSERT INTO tablename (column1, column2, column3)
SELECT val_ID, val_cat, val_sub
FROM dual
MINUS
SELECT val_ID, val_cat, val_sub
FROM tablename;
insert
语句没有 where
子句。不过,您可以通过使用 insert-select 语句来模拟它:
INSERT INTO tablename (column1, column2, column3)
SELECT val_ID, val_cat, val_sub
FROM dual
MINUS
SELECT column1, column2, column3
FROM tablename;
@Mureinik 的例子确实否定了我所有的错误;但是,在测试时它没有创建新行。
所以我目前的解决方法是 VB.net 中的一个查询,检查该值是否存在,然后实现一个简单的插入存储过程:
//Make select statement and look at table for whether more than 0 rows shows up. If 0 rows, then execute stored procedure
If DsAds1.Tables(0).Rows.Count = 0 Then
...do stored procedure
End If
存储过程
(val_ID tablename.column1%type,
val_cat tablename.column2%type,
val_sub tablename.column3%type
)
AS
BEGIN
INSERT INTO tablename (column1, column2, column3)
VALUES( val_ID, val_cat, val_sub);
COMMIT;
END;