2017-05-29 72 views
0

我有以下存儲過程我的SQL語法不能在存儲過程中比較本地vairaiable工作

DELIMITER $$ 

USE `mydb$$ 

DROP PROCEDURE IF EXISTS `add_master_profile_data_temp`$$ 

CREATE PROCEDURE `add_master_profile_data_temp`(
    IN _msisdn VARCHAR (50), 
    IN _device_identifier TEXT 
) 
BEGIN 
DECLARE lv_IDMsisdn BIGINT DEFAULT NULL; 
DECLARE lv_IDDevice BIGINT DEFAULT NULL ; 
    SET  @lv_IDMsisdn := (SELECT id  FROM `master_profile` WHERE `msisdn` = _msisdn) ; 

    SET  @lv_IDDevice := (SELECT id FROM `master_profile`  WHERE device_identifier =_device_identifier AND `msisdn` <> _msisdn AND `master_profile_status` = 1) ; 

    IF (@lv_IDDevice <> @lv_IDMsisdn) THEN  

     SELECT @lv_IDDevice ,@lv_IDMsisdn ,2 ; 
    ELSE 

     SELECT @lv_IDDevice ,@lv_IDMsisdn ,1; 
    END IF; 





END$$ 

DELIMITER ; 

問題是語法@lv_IDDevice <> @lv_IDMsisdn它總是即將來臨結果我是假 而得到

@lv_IDDevice @lv_IDMsisdn 1

62(NULL)1

EDIT

我甚至試過

CREATE PROCEDURE `add_master_profile_data_temp`(
    IN _msisdn VARCHAR (50), 
    IN _device_identifier TEXT 
) 
BEGIN 
DECLARE lv_IDMsisdn BIGINT; 
DECLARE lv_IDDevice BIGINT ; 
    #SET  @lv_IDMsisdn := (SELECT id  FROM `master_profile` WHERE `msisdn` = _msisdn) ; 

    #SET  @lv_IDDevice := (SELECT id FROM `master_profile`  WHERE device_identifier =_device_identifier AND `msisdn` <> _msisdn AND `master_profile_status` = 1) ; 


    SELECT id INTO lv_IDMsisdn FROM `master_profile` WHERE `msisdn` = _msisdn ; 

    SELECT id INTO lv_IDDevice FROM `master_profile`  WHERE device_identifier =_device_identifier AND `msisdn` <> _msisdn AND `master_profile_status` = 1 ; 

    IF (lv_IDDevice IS NOT NULL AND lv_IDDevice <> lv_IDMsisdn) THEN  

     SELECT lv_IDDevice ,lv_IDMsisdn ,2 ; 
    ELSE 

     SELECT lv_IDDevice ,lv_IDMsisdn ,1; 
    END IF; 





END$$ 

DELIMITER ; 
+0

'@ lv_IDDevice'和'@ lv_IDMsisdn'是[9.4用戶定義的變量(https://dev.mysql.com/doc/refman/5.7/en/user -variables.html)。 'lv_IDDevice'和'lv_IDMsisdn'是[13.6.4.1局部變量DECLARE語法](https://dev.mysql.com/doc/refman/5.7/en/declare-local-variable.html),是不同的變量。 – wchiquito

+0

我需要一個局部變量。我需要在Synstax中糾正什麼問題 –

+0

我無法重現問題。請參閱[db-fiddle](https://www.db-fiddle.com/f/fHgvtrxVqsTgmy6oWCGb1k/0)。 – wchiquito

回答

0

我最終什麼是設置@lv_IDMsisdn 0櫃面有人空。 像SET @lv_IDMsisdn = 0;

很奇怪,爲什麼不等於不給真正的結果,當在一邊,我們有值,而在另一側,我們有空

問題是語法

IF (`lv_IDDevice` IS NOT NULL AND `lv_IDDevice` <> `lv_IDMsisdn`) THEN 

一件事被另一個用戶建議是(雖然我還沒有試過)

IF (`lv_IDDevice` IS NOT NULL AND Not (`lv_IDDevice` <=> `lv_IDMsisdn`)) THEN 
+0

你可以創建完整的示例表,虛擬數據,存儲過程等並顯示出來。我們可以幫助您解決問題,因爲我們現在無法重現此問題。 – hiule

0

有很2周的事情要考慮:

刪除2條聲明語句,因爲他們是無稽之談:

DECLARE lv_IDMsisdn BIGINT DEFAULT NULL; 
DECLARE lv_IDDevice BIGINT DEFAULT NULL ; 

試穿在sql下面:

SELECT @lv_IDMsisdn := id  FROM `master_profile` WHERE `msisdn` = _msisdn; 

SELECT @lv_IDDevice :=id FROM `master_profile`  WHERE device_identifier =_device_identifier AND `msisdn` <> _msisdn AND `master_profile_status` = 1; 

然後,創建一個調試表。而看到從@lv_IDMsisdn和@lv_IDDevice什麼是真正的價值

CREATE TABLE `debug_table`(`ID` INT NOT NULL AUTO_INCREMENT, `DecimalValue` DECIMAL(10,6), PRIMARY KEY (`ID`)); 

- 添加2個報表後,他們被設定值

INSERT INTO `debug_table`(@lv_IDMsisdn); 
INSERT INTO `debug_table`(@lv_IDDevice); 
+0

沒有工作。刪除了聲明沒有效果。問題似乎只在不等於sysntax這不在這裏工作 –

+0

@KamranShahid,我更新了我的答案。讓我們嘗試調試真實的值。我認爲你沒有得到正確的價值來比較它們。 – hiule