2013-04-28 33 views
5

Cerco di creare una procedura nel mio database Oracle e non riesco a raggiungere per assegnare il risultato di una query alle mie variabili. Qui è quello che sto cercando di eseguire il debug:Assegnare una selezione a una variabile in una stored procedure

create or replace 
PROCEDURE PCD_COMBAT (identifier_perso NUMBER, identifier_advers NUMBER) AS 

ATT_PERSO NUMBER; 
OFF_PERSO NUMBER; 
DEF_ADVERS NUMBER; 

BEGIN 

OFF_PERSO := SELECT OFFENSE_PERSO FROM PERSONNAGE WHERE ID_PERSO = identifier_perso; 
DEF_ADVERS := SELECT DEFENSE_ADVERSAIRE FROM PERSONNAGE WHERE ID_ADVERSAIRE = identifier_advers; 
ATT_PERSO := OFF_PERSO - DEF_ADVERS; 
IF ATT_PERSO < 1 { ATT_PERSO := 1 }; 

END PCD_COMBAT; 

Si dice chiaramente in Oracle Developper che il mio Selezionare doesnt lui piacere e non riesco a capire perché. La libreria Oracle, i forum e gli esempi di codice che ho letto non hanno aiutato molto.

risposta

10

è necessario utilizzare SELECT INTO. Inoltre non ci sono parentesi graffe in PL/SQL è necessario utilizzare THEN e END IF. Non sono abbastanza sicuro di quello che fai con il risultato. Vuoi restituirlo? Allora hai bisogno di un FUNCTION. Dovrebbe sembrare qualcosa del genere (non testata):

create or replace 
FUNCTION PCD_COMBAT (identifier_perso NUMBER, identifier_advers NUMBER) 
RETURN NUMBER 
AS 
    ATT_PERSO NUMBER; 
    OFF_PERSO NUMBER; 
    DEF_ADVERS NUMBER; 
BEGIN  
    SELECT OFFENSE_PERSO 
    INTO OFF_PERSO 
    FROM PERSONNAGE 
    WHERE ID_PERSO = identifier_perso; 
    SELECT DEFENSE_ADVERSAIRE 
    INTO DEF_ADVERS 
    FROM PERSONNAGE 
    WHERE ID_ADVERSAIRE = identifier_advers; 

    ATT_PERSO := OFF_PERSO - DEF_ADVERS; 
    IF ATT_PERSO < 1 THEN 
    ATT_PERSO := 1; 
    END IF 

    RETURN ATT_PERSO; 

END PCD_COMBAT; 
+0

Thx, ho provato INSERT INTO prima e ora mi rendo conto che ho appena frainteso la sintassi per usarlo. È bello sapere delle parentesi graffe, sono abituato al C# e alla programmazione Java, i DB sono abbastanza nuovi per me. –

2

Non penso che sia possibile assegnare valori a variabili del genere. Prova SELECT INTO in questo modo:

create or replace 
PROCEDURE PCD_COMBAT (identifier_perso NUMBER, identifier_advers NUMBER) AS 

ATT_PERSO NUMBER; 
OFF_PERSO NUMBER; 
DEF_ADVERS NUMBER; 

BEGIN 


SELECT OFFENSE_PERSO INTO OFF_PERSO FROM PERSONNAGE WHERE ID_PERSO = identifier_perso; 
SELECT DEFENSE_ADVERSAIRE INTO DEF_ADVERS FROM PERSONNAGE WHERE ID_ADVERSAIRE = identifier_advers; 
ATT_PERSO := OFF_PERSO - DEF_ADVERS; 
IF ATT_PERSO < 1 { ATT_PERSO := 1 }; 

END PCD_COMBAT; 
Problemi correlati