插入带有 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;