我有这个pl / sql存储过程,将玩家添加到新的cleub
所以第一部分工作核心,但是第二部分不起作用,我无法找到问题在哪里。 那就是代码:
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;
答案 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分配给任何变量,否则按正常流程进行。