2013-04-28 82 views
5

我嘗試在Oracle數據庫中創建過程,但無法實現將查詢結果分配給我的變量。這裏就是我試圖調試:將選擇分配給存儲過程中的變量

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; 

在Oracle Developper清楚地說,我的選擇犯規取悅他,想不通爲什麼。我閱讀的Oracle庫,論壇和代碼示例沒有太多幫助。

回答

10

您需要使用SELECT INTOPL/SQL也沒有大括號,您需要使用THENEND IF。我不太確定你對結果做了什麼。你想放棄嗎?那麼你需要一個FUNCTION。它應該看起來像這樣(未經測試):

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,我試過INSERT INTO之前,現在我意識到,我只是誤解了使用它的語法。很高興知道大括號,我習慣於C#和Java編程,DB對我來說是相當新的。 – 2013-04-29 04:42:41

2

我不認爲你可以給這樣的變量賦值。嘗試像這樣SELECT INTO:

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;