2012-05-01 8 views
2

SQLワークベンチでストアドプロシージャを作成しています。私は、スペースがユーザーによって挿入されていない場合でも、7文字の郵便番号で 'dn35 7tg'をフォーマットするために住所の郵便番号を修正しています。ストアドプロシージャのデータを操作しようとしたときにnull値が表示される

まず、私の状況を助けない変数をコンソール画面に表示する方法を見つけることができません。 Callステートメント

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

を実行している場合

私は値が正しい書式でデータベースに入力された見つけることを除いて、しかし私が得るすべてはPKで、ヌルとNullが列に入りました。いくつかは、正しい方向に私を指すことができれば

私はあなたのすべてをありがとう

フル素晴らしいことです。

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

は、なぜあなたは、パラメータを宣言している:これは、すべてが1回の呼び出しで行うことができます

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

:これはの最終的な結果を与える

CHAR_LENGTH(@PostCode) - 2 

'SupplierPostCode'は' VARCHAR(15) '型であり、そのデータの半分を' VARCHAR(8) '型の' postcode'変数に代入するだけです。 – eggyal

答えて

1

私はMySQLでは素晴らしいとは言えませんが、私にはいくつかのエラーがあります。

最初に、挿入する前にnew_nameを決して設定しないので、常にnullになります。

第二に、私はMySQLはStringA + StringBを使用して文字列の連結を好きとは思わない、あなたは(eggyalで指摘したように)あなたの挿入コマンドに構文エラーがあり、第三にCONCAT(StringA, StringB)

を使用する必要があります。

しかし、別のメモでは、あなたのロジックが正しく英国ポストコードをフォーマットすることができません。あなたは、「書式設定」郵便番号が混乱している見ることができるように

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

:例えば、M1 1AAは完全に有効な英国の郵便番号です。 INSERT機能を使用すると、これをもっと簡単に行うことができます。英国のポストコードは、可変数の文字(2〜4)とそれに続く3文字のスペースです。

最初のステップは、入力を浄化するためであるべきである(私のテストFiddleに基づい@PostCodeするassummed)

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

これは、すべてのスペースが削除され、生の入力にスペースがあるかどうかは無関係です。

文字列の最後から3文字分のスペースを挿入する必要があります。この位置を見つけるには、あなたが使用します。

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 Fiddle](http://sqlfiddle.com/#!2/c79ae/10)を確認しましたか?これは少なくともあなたを始めさせるはずです。 – GarethD

+0

ご協力いただきありがとうございました。私のストアドプロシージャは、電話操作と重複チェックを含む単一の手順ですべてのサプライヤ情報を保存できるようになりました。仕事は終わった!!!!!!!!!!! –

0
  1. あなたのINSERTコマンドの構文エラーがあります。

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

    ではなく、あなたがあなたの変数new_namenew_postcodeDECLAREする必要が

    INSERT INTO tblsupplier (SupplierName, SupplierPostCode) VALUES (new_name, new_postcode); 
    
  2. でなければなりません。

  3. new_nameに値を割り当てる必要があります。

関連する問題