2016-05-11 4 views
1

私はストアドプロシージャのnoobieです。今は動作するものがありますが、最適化する方法を学びたいと思います。MySQLストアドプロシージャは複数のパラメータを返します

CREATE DEFINER=`simonh`@`%` PROCEDURE `get_normalized_client_id`(IN source_id INT, IN source_division VARCHAR(255), IN source_currency VARCHAR(255), OUT NORMALIZED_ID INT, OUT NAME VARCHAR(255), OUT ADDRESS VARCHAR(255)) 
BEGIN 

IF source_id > 100000 THEN SET source_id = source_id - 100000; END IF; 

SELECT 
CLIENT.NEW_GROUP_REFERENCE_NUMBER INTO NORMALIZED_ID 
FROM ccis_vendors.client_id SOURCE 
INNER JOIN ccis_vendors.receivable CLIENT ON CLIENT.id = SOURCE.ACCOUNT_ID 
WHERE SOURCE.number = source_id AND SOURCE.division = source_division; 

SELECT 
CLIENT.name INTO NAME 
FROM ccis_vendors.client_id SOURCE 
INNER JOIN ccis_vendors.receivable CLIENT ON CLIENT.id = SOURCE.ACCOUNT_ID 
WHERE SOURCE.number = source_id AND SOURCE.division = source_division; 

SELECT 
CONCAT(IFNULL(CLIENT.OPERATION_STREET,''), ' ', IFNULL(CLIENT.OPERATION_CITY,''), ' ', 
IFNULL(CLIENT.OPERATION_STATE_PROVINCE, ''), ' ', IFNULL(CLIENT.OPERATION_ZIP, '')) INTO ADDRESS 
FROM ccis_vendors.client_id SOURCE 
INNER JOIN ccis_vendors.receivable CLIENT ON CLIENT.id = SOURCE.ACCOUNT_ID 
WHERE SOURCE.number = source_id AND SOURCE.division = source_division; 

END 

ご覧のとおり、同じクエリを3回使用して3つのOUTパラメータを設定しています。

私の質問は、1つのクエリでそれを行う方法はありますか?

ありがとうございました。

EDIT: なぜINTOが今私にとってうまくいかなかったのか分かります。私は構文が間違っている。

CREATE PROCEDURE `t_get_normalized_client_id`(IN source_id INT, IN source_division VARCHAR(255), IN source_currency VARCHAR(255), OUT NORMALIZED_ID INT, OUT NAME VARCHAR(255), OUT ADDRESS VARCHAR(255)) 
BEGIN 

IF source_id > 100000 THEN SET source_id = source_id - 100000; END IF; 

SELECT 
CLIENT.NEW_GROUP_REFERENCE_NUMBER, 
CLIENT.name, 
CONCAT(IFNULL(CLIENT.OPERATION_STREET,''), ' ', IFNULL(CLIENT.OPERATION_CITY,''), ' ', 
IFNULL(CLIENT.OPERATION_STATE_PROVINCE, ''), ' ', IFNULL(CLIENT.OPERATION_ZIP, '')) 

INTO 
NORMALIZED_ID, 
NAME, 
ADDRESS 

FROM ccis_vendors.client_id SOURCE 
INNER JOIN ccis_vendors.receivable CLIENT ON CLIENT.id = SOURCE.ACCOUNT_ID 
WHERE SOURCE.number = source_id AND SOURCE.division = source_division; 

END 

みんなありがとう:

ここで作業バージョンです!

答えて

1

選択を1つに簡略化することができます。そして、私はパラメータのための一貫性のある命名規則を使用することをお勧めします - ので、列との混同可能性は低いがあります:

DELIMITER $$ 
CREATE DEFINER=`simonh`@`%` PROCEDURE `get_normalized_client_id`(
    IN in_source_id INT, 
    IN in_source_division VARCHAR(255), 
    IN in_source_currency VARCHAR(255), 
    OUT out_NORMALIZED_ID INT, 
    OUT out_NAME VARCHAR(255), 
    OUT out_ADDRESS VARCHAR(255) 
) 
BEGIN 
    IF in_source_id > 100000 THEN 
     SET in_source_id = in_source_id - 100000; 
    END IF; 

    SELECT out_NORMALIZED_ID := CLIENT.NEW_GROUP_REFERENCE_NUMBER, 
      out_Name := CLIENT.NAME, 
      out_Address := CONCAT_WS(' ', CLIENT.OPERATION_STREET, CLIENT.OPERATION_CITY, 
            CLIENT.OPERATION_STATE_PROVINCE, CLIENT.OPERATION_ZIP 
            ) 
    FROM ccis_vendors.client_id SOURCE INNER JOIN 
     ccis_vendors.receivable CLIENT 
     ON CLIENT.id = SOURCE.ACCOUNT_ID 
    WHERE SOURCE.number = in_source_id AND SOURCE.division = in_source_division; 

END;$$ 
DELIMITER ; 

また:

  • 私は複数の行にIFを置きます。 END IFがあることは明らかです。一般的に、私は、適切な終了を確実にするために、 "beginnings"の直下に "end"を置いています。
  • CONCAT_WS()は、CONCAT()よりも優れています。ボーナスとして、NULLの値も処理します。
  • INTOではなく、:=のインライン構文を使用します。これは本当に単なるスタイルの問題です。 INTOはファイルアクセスなどの目的で使用されているので、:=がより明確になっています。
+0

おそらく、私が持っているmysqlが期限切れです。エラーメッセージが表示されます。 #1064 - SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、適切な構文を使用して ':= CLIENT.NEW_GROUP_REFERENCE_NUMBER、 out_Name:= CLIENT.NAME、 ' 12行目に表示してください。 –

+0

MySQLクライアントバージョン:5.5.29 –

+0

@SimonHU。 。 。 'INTO'バージョンは動作しますか? –

1

あなたはこのようにできませんか?

CREATE DEFINER=`simonh`@`%` PROCEDURE `get_normalized_client_id`(IN source_id INT, IN source_division VARCHAR(255), IN source_currency VARCHAR(255), OUT NORMALIZED_ID INT, OUT NAME VARCHAR(255), OUT ADDRESS VARCHAR(255)) 
    BEGIN 

IF source_id > 100000 THEN SET source_id = source_id - 100000; END IF; 

SELECT 
CLIENT.NEW_GROUP_REFERENCE_NUMBER INTO NORMALIZED_ID, 
CONCAT(IFNULL(CLIENT.OPERATION_STREET,''), ' ', IFNULL(CLIENT.OPERATION_CITY,''), ' ', 
IFNULL(CLIENT.OPERATION_STATE_PROVINCE, ''), ' ', IFNULL(CLIENT.OPERATION_ZIP, '')) INTO ADDRESS, 
CLIENT.name INTO NAME 
FROM ccis_vendors.client_id SOURCE 
INNER JOIN ccis_vendors.receivable CLIENT ON CLIENT.id = SOURCE.ACCOUNT_ID 
WHERE SOURCE.number = source_id AND SOURCE.division = source_division; 


END 
+0

これをやろうとしましたが、INNER JOINで宣言されたCLIENTが存在しないというエラーメッセージが表示されます。 –

+0

奇妙な、あなたの質問は有効ですか?あなたの質問にあなたが書いた質問を実行し、あなたが得るものを見てください。 –

+0

私はこのストアドプロシージャを動作させており、最適化をしたいだけです。 –

0

あなたがたとの間の開始と終了の文は、NAME INTO CLIENT.name、 CLIENT.NEW_GROUP_REFERENCE_NUMBER INTO NORMALIZED_ID、 CONCAT(IFNULL(CLIENT.OPERATION_STREET、 '')、 ''、IFNULL(CLIENT.OPERATION_CITYを選択 、 '')、 ''、 IFNULL(CLIENT.OPERATION_STATE_PROVINCE、 '')、 ''、IFNULL(CLIENT.OPERATION_ZIP、 ''))ADDRESS INTO ccis_vendors.client_id源 INNERからクライアントON ccis_vendors.receivableクライアントを登録しよう。 id = SOURCE.ACCOUNT_ID ここで、SOURCE.number = source_idとSOURCE.division = source_division;

関連する問題