如果是SQL中的ELSE语句

时间:2014-07-13 13:50:16

标签: sql oracle stored-procedures plsql

我有这个pl / sql存储过程,将玩家添加到新的cleub

  1. 搜索此玩家是否已经在同一个cleub中,所以它只是更新他的cleub值
  2. 但是如果这个玩家没有在任何cleub中写入,那么像新的n元组一样INSERT他completlty
  3. 所以第一部分工作核心,但是第二部分不起作用,我无法找到问题在哪里。 那就是代码:

    CREATE OR REPLACE PROCEDURE INSERT_PLAYER_IN_CLEUB( n_joueur IN VARCHAR2,n_cleub IN VARCHAR2, d IN DATE,n_maillot IN INT )
    AS
      v_id_j   INT;
      v_id_c   INT;
      id_exist INT := 0;
    BEGIN
      SELECT id_j INTO v_id_j FROM joueur WHERE nom=n_joueur;
      dbms_output.put_line(v_id_j);
      SELECT id_c INTO v_id_c FROM cleub WHERE nom_cleub=n_cleub;
      dbms_output.put_line(v_id_c);
      SELECT id_j INTO id_exist FROM JOUEUR_CLEUB WHERE v_id_j=ID_J;
      dbms_output.put_line(id_exist);
      IF (id_exist = 0) THEN
        INSERT INTO joueur_cleub VALUES(v_id_j,v_id_c,d,n_maillot);
      ELSE
        UPDATE JOUEUR_CLEUB SET id_c=v_id_c,DATE_debut=d ,NUMERO_MAILLOT=n_maillot WHERE id_j=v_id_j;
      END IF;
    END;
    

2 个答案:

答案 0 :(得分:1)

MERGE INTO JOUEUR_CLEUB J
USING DUAL ON (ID_J = v_id_j)
WHEN MATCHED THEN
  UPDATE SET id_c=v_id_c,DATE_debut=d 
WHEN NOT MATCHED THEN
  INSERT VALUES(v_id_j,v_id_c,d,n_maillot);

而不是DUAL,您可以使用其他表格,如果您想根据JOIN

检查记录是否存在

答案 1 :(得分:0)

问题是你没有检查记录是否存在于表中。

例如你写了---

SELECT id_j INTO v_id_j FROM joueur WHERE nom=n_joueur;

如果表joueur中没有nom = n_joueur的记录,您的代码将抛出异常。在将id分配给任何变量之前,请确保检查是否存在。

这可以通过---

来实现
select count(*) from joueur WHERE nom=n_joueur;

如果为零则则不存在记录,因此在这种情况下不需要将id分配给任何变量,否则按正常流程进行。