Questione : aggiornare la tabella se l'annotazione non esiste al contrario annotazione dell'inserto

Ho un programmatore che sta provando ad ottenere questo codice a work.
I non ritiene che la logica sia corretto - posso voi dirmi che cosa errato? il

He vuole controllare la tabella per vedere se un'annotazione esiste - se esiste lui vuole aggiornarla - se non esiste lui vuole inserire il record.
##########################################################
CREATE O SOSTITUIRE LA FUSIONE del
AS
BEGIN

di PROCEDURA CNSADMIN.UpdateApprovedScoutRule
(p_SID in ApprovedScoutRule.SID%TYPE, p_RuleText del
in ApprovedScoutRule.RuleText%TYPE, p_DefaultPriority del
in ApprovedScoutRule.DefaultPriority%TYPE, p_IsSoRule del
in ApprovedScoutRule.IsSoRule%TYPE,
del
p_IsIgnored in ApprovedScoutRule.IsIgnored%TYPE
) nel asr
di ApprovedScoutRule USING (Sid PRESCELTO,
RuleText,
DefaultPriority,
IsSoRule,
IsIgnored da ApprovedScoutRule)
(asr2.SID = asr.SID) su
QUANDO THEN
       --AGGIORNARE il
SET
dell'AGGIORNAMENTO di RULE
asr.RuleText = p_RuleText, il
asr.DefaultPriority = p_DefaultPriority, il
asr.IsSoRule = p_IsSoRule, il
asr.IsIgnored = p_IsIgnored
DOVE asr.SID = p_SID
QUANDO
            --INSERIRE il NUOVO
VALUES
(p_SID, p_RuleText del
, p_DefaultPriority del
, p_IsSoRule del
, p_IsIgnored
di RULE
INSERT
(asr.SID,
asr.RuleText,
asr.DefaultPriority,
asr.IsSoRule,
asr.IsIgnored) del
); il
del
COMMETTE;
EXCEPTION
del
del
QUANDO ALTRI ALLORA
RAISE_APPLICATION_ERROR (- 20001, p_SID del
   || “: $: „ || p_RuleText del
   || “: $: „ ||p_DefaultPriority del
   || “: $: „ ||p_IsSoRule del
   || “: $: „ ||IL
SQLERRM, ALLINEA);

END UpdateApprovedScoutRule;
/
###########################################################

Thanks
class= del

Risposta : aggiornare la tabella se l'annotazione non esiste al contrario annotazione dell'inserto

Controllo fuori:
http://jasonvogel.blogspot.com/2008/01/upsert-merge-within-same-table-oracle.html


Quel condurrlo al seguente banco di prova.  Nota: Ho cambiato il nome della tabella.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
eliminazione dei fogli inceppati del myApprovedScoutRule della tabella  di goccia;
generare il myApprovedScoutRule della tabella (carbone di Sid (1), carbone del ruletext (1), carbone di defaultpriority (1), carbone del issorule (1), carbone isignored (1));
inserire nei valori del myApprovedScoutRule (“a„, “b„, “c„, “d„, “e ");
inserire nei valori del myApprovedScoutRule (“z„, “z„, “z„, “z„, “z ");
commettere;

GENERARE O SOSTITUIRE la PROCEDURA UpdateApprovedScoutRule
(
    p_SID in myApprovedScoutRule.SID%TYPE,
    p_RuleText in myApprovedScoutRule.RuleText%TYPE,
    p_DefaultPriority in myApprovedScoutRule.DefaultPriority%TYPE,
    p_IsSoRule in myApprovedScoutRule.IsSoRule%TYPE,
    p_IsIgnored in myApprovedScoutRule.IsIgnored%TYPE
)
AS
COMINCIARE

    FONDER nel asr del myApprovedScoutRule
    USANDO (SELEZIONARE il p_sid il Sid,
             p_ruletext RuleText,
             p_DefaultPriority DefaultPriority,
             p_IsSoRule IsSoRule,
             IsIgnored p_IsIgnored) da asr2 doppio   
    SU (asr2.SID = asr.SID)
    UNA VOLTA ALLORA ABBINATO
       --REGOLA ATTUALE DELL'AGGIORNAMENTO
        AGGIORNAMENTO 
            INSIEME
                 asr.RuleText = p_RuleText,
                 asr.DefaultPriority = p_DefaultPriority,
                 asr.IsSoRule = p_IsSoRule,
                 asr.IsIgnored = p_IsIgnored
            DOVE asr.SID = p_SID
      UNA VOLTA ALLORA NON ABBINATO    
            --INSERIRE LA NUOVA REGOLA
            INSERTO
                (asr.SID,
                 asr.RuleText,
                 asr.DefaultPriority,
                 asr.IsSoRule,
                 asr.IsIgnored)
            VALORI
                (p_SID,
                 p_RuleText,
                 p_DefaultPriority,
                 p_IsSoRule,
                 p_IsIgnored
                );
    
    COMMETTERE;
    
    
ECCEZIONE
        QUANDO ALTRI ALLORA 
             RAISE_APPLICATION_ERROR (- 20001, 
              p_SID    || “: $: „ || 
              p_RuleText    || “: $: „ ||
              p_DefaultPriority    || “: $: „ ||
              p_IsSoRule    || “: $: „ ||
              SQLERRM, ALLINEANO);

ESTREMITÀ UpdateApprovedScoutRule;
/

mostrare gli errori


updateapprovedscoutrule del exec (“a„, “a„, “a„, “a„, “a ");
updateapprovedscoutrule del exec (“b„, “b„, “b„, “b„, “b ");

selezionare * a partire da myApprovedScoutRule;
Altre soluzioni  
 
programming4us programming4us