2016-08-23 21 views
0

這裏是我的典型存儲過程的開始:有沒有辦法以任何順序將參數傳遞給MySQL存儲過程?

CREATE DEFINER=`joe`@`%` PROCEDURE `Add_Item`(
    IN usernameApp VARCHAR(255), 
    IN barcodeApp VARCHAR(255), 
    IN quantityApp VARCHAR(255) 
) 
BEGIN 

我會從PHP這樣的代碼調用它:

CALL Add_Item('ethan', '987261826671', '12'); 

的問題是,我在尋找的東西更動態一點,我可以用任何順序的參數調用存儲過程(因爲我無法保證我嘗試創建的動態應用程序中的順序)。我覺得像命名參數可以工作,但我知道MySQL沒有這樣的程序。

像這樣的工作,例如(僞代碼顯然):

CALL Add_Item(quantity>'12' name>'ethan', barcode>'987261826671'); 

想法?

+1

沒有。沒有辦法做'add_item(quantityapp = 12,usernameapp ='ethan',等等......)'。你在存儲過程中定義的其他參數中傳遞參數,或者根本不傳遞任何參數。 –

回答

1

使用PDO:

$sth = $dbh->prepare('CALL Add_Item(:quantity, :name, :barcode)'); 
// You can pass paremeters in any order here: 
$sth->execute([ 
    ':quantity' => 12, 
    ':name' => 'ethan', 
    ':barcode' => '987261826671', 
]); 
0

的參數到存儲過程是固定的。沒有可選參數,訂單已修復。沒有像Perl或Python這樣的命名參數。

你可以做一個解決方法如下:

SET @quantity = 12; 
SET @name = 'ethan'; 
SET @barcode = '987261826671'; 
CALL Add_Item(); 

換句話說,使用會話變量,而不是過程的參數。然後,您可以按任意順序設置會話變量。

僅通過使用@前綴即可在過程代碼中引用會話變量。會話變量僅在當前會話中可見。

但是,這種解決方法不適用於遞歸過程,在遞歸調用中要將參數傳遞給過程。另外,如果您在會話期間多次調用該過程,則必須記住更改這些值,否則之前調用的值可能會傳遞給後續調用。我不得不說這是一個奇怪的問題。許多編程語言,甚至是PHP,都要求你以特定的順序用參數調用函數或過程。這不是一個太困難的約束。

相關問題