我有一个Oracle 10g的存储过程,需要在表中创建一个新行,而不是创建重复项。
只要所有列都不相同,该表就允许重复。这是因为最后两列的值可能不同。
话虽如此,当我尝试存储我的程序时,我得到以下标志:
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子句]。
所以要么我的格式不是应该的格式,要么我的逻辑关闭。 无论情况如何,我都尝试在线查找并在stackoverflow上找到示例,并且不尽如人意。
有关如何调整此内容的任何建议吗?
(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;
答案 0 :(得分:1)
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;
答案 1 :(得分:0)
@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;