【问题标题】:Insert Stored Procedure with WHERE clause使用 WHERE 子句插入存储过程
【发布时间】:2025-12-17 20:05:02
【问题描述】:

我有一个用于 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 子句]。

所以要么我的格式不应该是这样,要么我的逻辑不正确。 无论是哪种情况,我都尝试在网上和 * 上查找示例,但都失败了。

关于我应该如何调整它的任何建议?

 (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; 

【问题讨论】:

    标签: stored-procedures oracle10g where-clause insert-into


    【解决方案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;
    

    【讨论】:

    • 但这看起来不像是存储过程插入。所以我也可以将这种格式用于存储过程?
    • @narue1992 恕我直言,存储过程是多余的,但可以肯定的是,您可以用这个替换过程中当前的insert 语句(如您所述,这不起作用)。
    • 这其中的哪一部分可以防止所有列不等于我的val 变量的重复?不确定MINUS 意味着什么
    • @narue1992 minus 是 Oracle 的等效于 ANSI 的 except。如果表中存在此类行,则不会重新插入。
    • 我实现了它,它仍然显示Line # = 10 Column # = 1 Error Text = PL/SQL: SQL Statement ignored,并且由于某种原因,我在Select 行中的column3 名称无效[多次重新检查拼写并且它是正确的] - 请参阅更新
    【解决方案2】:

    @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;   
    

    【讨论】: