2012-05-01 47 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