2015-05-08 49 views
1

我正在創建一個存儲過程,它需要一些輸入參數。我希望能夠選擇使用哪個數據庫,此後根據如下所示的條件,我想使用正確的條件。MySQL動態設置數據庫名稱並選擇db.schematable

我知道你不能在存儲過程中使用「USE」關鍵字,我也嘗試在查詢中設置@ds,但沒有太多成功。

我使用的Navicat並在IDE中定義了我的參數,我輸入PARAMS是:

  • icustomername VARCHAR(255)
  • ipostcode VARCHAR(255)
  • iaccountnumber VARCHAR(255)
  • imemberdbname VARCHAR(255)

SQL

BEGIN 
declare dbName varchar(255); --attempt at using db name passed in 
select imemberdbname into dbName; 
set @ds = concat(dbName,'.customers'); -- I have also tried this 

if LENGTH(icustomername) > 0 THEN 
    (Select customerid, customername, postcode, accountnumber from dbName.customers 
     WHERE customername = icustomername); 
ELSEIF len(ipostcode) > 0 THEN 
    (Select customerid, customername, postcode, accountnumber from dbName.customers 
     WHERE postcode = ipostcode); 
ELSE 
    (Select customerid, customername, postcode, accountnumber from dbName.customers 
     WHERE accountnumber = iaccountnumber); 
end if; 

END 

我無法選擇db.table以執行選擇。這有可能嗎?還是有更好的解決方案?

回答

1

你可以用prepared statement來做到這一點。

一個非常基本的事先準備好的聲明看起來是這樣的:

SET @stat = CONCAT('SELECT * FROM ', @tab'); 

PREPARE stmt FROM @stat; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

編輯:最基本的語句羽翼豐滿例如,使用if語句來設置變量的「其中」和「表」條款和你應該沒問題!

編輯2:想象你不想使用傳入參數,編輯查詢語句。

EDIT3:基本上完成了存儲過程,您可以使用CALL test('dbname.tablename')調用該過程。您在此處提供的參數是tablename/dbname.tablename。

CREATE DEFINER=`user`@`%` PROCEDURE `test`(IN tbl VARCHAR(255)) 
BEGIN 
DECLARE cols VARCHAR(255); 
DECLARE conditions VARCHAR(255); 

SET cols = 'customerid, customername, postcode, accountnumber'; 


IF LENGTH(icustomername) > 0 THEN 
SET conditions = CONCAT("customername = '", icustomername, "'"); 

ELSEIF len(ipostcode) > 0 THEN 
SET conditions = CONCAT("postcode = '", ipostcode, "'"); 

ELSE SET conditions = CONCAT("accountnumber = '", iaccountnumber , "'"); 
END IF; 

    SET @stat = CONCAT('SELECT ', cols, ' FROM ', tbl, ' WHERE ', conditions); 
    PREPARE stmt from @stat; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END 

------- 
CALL test('tablename'); 
+0

因此,對於我的查詢將每個選擇是一個單獨的@stat? – Haris

+0

從我所看到的,你所有的查詢基本上都是一樣的。您可以保留一個@stat來執行,並使用您的變量動態設置表名和where語句。 – Tom

+0

此聲明將被包裝在BEGIN END中? – Haris