2012-05-01 53 views
2

操縱數據,我創造了我的SQL工作臺上的存儲過程顯示。我正在修改地址的郵編,以格式化'dn35 7tg',即使用戶沒有插入空格,也可以使用7個字符的郵政編碼。Null值當試圖在存儲過程

首先,我找不到打印變量的康壽屏幕,這不利於我的情況的一種方式。

當運行Call語句

CALL usp_addsupplier('Bobs shopping mania', 'dn465th'); 

我除了找值訂立正確的格式的數據庫,但我得到的是PK,空和空列中的輸入。

如果某些可能會在正確的方向指向我,我將是巨大的全

謝謝大家。

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_addsupplier`(IN SuppliersName VARCHAR(30), IN SuppliersPostCode VARCHAR(15)) 

BEGIN 


-- Declare the change varables 
DECLARE postcode VARCHAR(8) DEFAULT SuppliersPostCode; 

SET postcode = SuppliersPostCode; 

-- Postcode reformat ----------------------------------------------- 

-- Change postcode to uppercase 

SET postCode = UPPER(postCode); 

-- Grabs the first 4 letters and stores them in a new varable 

SET new_postcode = LEFT (postCode,4); 

-- Adds the space to the first 4 letters 

SET new_postcode = new_postcode + ' '; 

-- Add the last 3 letters to the new varable 

SET new_postcode = new_postcode + RIGHT(postCode,3); 

INSERT INTO tblsupplier (SupplierName, SupplierPostCode VALUES (new_name, new_postcode)); 

END 
+0

你爲什麼要聲明參數'SupplierPostCode'的類型爲'VARCHAR(15)',那麼只需將其分配給''VARCHAR(8)''類型的'postcode'變量來丟失一半數據呢? – eggyal

回答

1

我對MySQL並不擅長,但是有一些錯誤在我身上跳出來。

首先,你從來沒有new_name插入之前,所以這將永遠是空的。

其次,我不認爲MySQL的使用StringA + StringB喜歡字符串連接,你需要使用CONCAT(StringA, StringB)

第三,在INSERT命令語法錯誤(用eggyal指出)。

在一個單獨的說明但是,您的邏輯是行不通的正確格式英國的郵政編碼。例如,M1 1AA是一個完全有效的英國郵編:

M1 1AA --> M1 1 1AA 
M11AA --> M11A 1AA 

正如你可以看到「格式化」郵政編碼是一個爛攤子。您可以使用INSERT函數以更簡單的方式實現此目的。英國郵政編碼是一個可變數量的字符(2-4),後跟一個空格,後面跟着3個字符。

的第一步應該是淨化輸入(assummed被@PostCode基於對我的測試Fiddle

REPLACE(@PostCode, ' ', ''); 

這將刪除所有空格,所以它是不相關的原始輸入是否有空格或不。

然後您需要從字符串的末尾插入一個空格3個字符。爲了找到這個位置你使用:

CHAR_LENGTH(@PostCode) - 2 

這給出了最終結果:

UPPER(INSERT(REPLACE(@PostCode, ' ', ''), CHAR_LENGTH(REPLACE(@PostCode, ' ', '')) - 2, 0, ' '))) 

因此,這都可以在一個調用來完成:

SET @SupplierName = 'Test'; 
SET @PostCode = 'M 1 1 A A '; 

INSERT INTO tblSupplier (SupplierName, SupplierPostCode) 
VALUES (@SupplierName, UPPER(INSERT(REPLACE(@PostCode, ' ', ''), CHAR_LENGTH(REPLACE(@PostCode, ' ', '')) - 2, 0, ' '))); 
+0

謝謝,我在SQL Server中工作,但我發現的MySQL更難。我對你給我的信息有興趣,希望我能破解這個。 :0) –

+0

你檢查了[SQL小提琴](http://sqlfiddle.com/#!2/c79ae/10)嗎?這至少應該讓你開始。 – GarethD

+0

感謝您的幫助,所有破解它,現在我的存儲過程可以存儲所有的供應商信息在一個單一的程序,包括電話操作和複製檢查。做得好!!!!!!!!!!! –

0
  1. 你有一個語法錯誤在你INSERT命令:

    INSERT INTO tblsupplier (SupplierName, SupplierPostCode VALUES (new_name, new_postcode)); 
    

    應改爲

    INSERT INTO tblsupplier (SupplierName, SupplierPostCode) VALUES (new_name, new_postcode); 
    
  2. 您需要DECLARE你的變量new_namenew_postcode

  3. 您需要的值賦給new_name