2012-03-23 34 views
2

我正在使用MySQL數據庫並嘗試創建存儲過程。我該如何做到這一點,如果query1的結果沒有記錄,那麼它執行一個不同的查詢?如果條件爲真,請在MySQL存儲過程中運行查詢

這是我到目前爲止有:

/* CREATE DB */ 
CREATE DATABASE mydata; 
use mydata; 
/* TABLE */ 
CREATE TABLE mydata (
ID BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
Name      VARCHAR(255) NOT NULL, 
Value      VARCHAR(255) NOT NULL 
) ENGINE=InnoDB; 
INSERT INTO mydata (Name, Value) VALUES ("testname", "testvalue"); 

/* STORED PROCEDURE */ 
delimiter // 
CREATE PROCEDURE myproc(IN myTable VARCHAR(255), 
         IN myValue VARCHAR(255), 
         IN myValueTwo VARCHAR(255)) 
BEGIN 
    SET @iTable=myTable; 
    SET @iValue=myValue; 
    SET @iValueTwo=myValueTwo; 

    SET @query = CONCAT('SELECT Name FROM ', @iTable, 
     ' WHERE Value="', @iValue, '"'); 
    SET @querytwo = CONCAT('SELECT Name FROM ', @iTable, 
     ' WHERE Value="', @iValueTwo, '"'); 
    PREPARE QUERY FROM @query; 
    EXECUTE QUERY; 

END // 
delimiter ; 

/* CALL */ 
call myproc("mydata", "testvalue", ""); 

我想運行一個查詢,並執行輔助查詢只有當第一個沒有行。做這個的最好方式是什麼?

+0

是否需要表和插入語句應該是動態的?使用動態sql是不好的方法。 – 2012-03-23 20:05:07

回答

3

這花了一些工作,但我做了足夠的調整。您的代碼問題與您的邏輯無關,但與MySQL存儲過程語言本身無關。在做動態SQL時它有確定範圍的問題。

我所做的就是創建一個臨時表,並沉積在返回的值在它

下面是一些示例數據加載

mysql> drop database if exists user391986; 
Query OK, 1 row affected (0.08 sec) 

mysql> create database user391986; 
Query OK, 1 row affected (0.00 sec) 

mysql> use user391986 
Database changed 
mysql> CREATE TABLE mytable (
    -> ID BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> Name VARCHAR(255) NOT NULL, 
    -> Value VARCHAR(255) NOT NULL 
    ->) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.11 sec) 

mysql> INSERT INTO mytable (Name,Value) VALUES 
    -> ('rolando','edge'),('pamela','washington'), 
    -> ('dominique','wilkins'),('diamond','cutter'); 
Query OK, 4 rows affected (0.06 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> SELECT * from mytable; 
+----+-----------+------------+ 
| ID | Name  | Value  | 
+----+-----------+------------+ 
| 1 | rolando | edge  | 
| 2 | pamela | washington | 
| 3 | dominique | wilkins | 
| 4 | diamond | cutter  | 
+----+-----------+------------+ 
4 rows in set (0.00 sec) 

mysql> 

這裏是能捕獲返回值的臨時存儲過程表

mysql> delimiter // 
mysql> CREATE PROCEDURE myproc(IN myTable VARCHAR(255), IN myValue VARCHAR(255), IN myValueTwo VARCHAR(255)) 
    -> BEGIN 
    ->  DECLARE foundcount INT; 
    ->  DECLARE retval VARCHAR(255); 
    -> 
    ->  SET @iTable=myTable; 
    ->  SET @iValue=myValue; 
    ->  SET @iValueTwo=myValueTwo; 
    -> 
    ->  CREATE TEMPORARY TABLE IF NOT EXISTS mynumber (rv VARCHAR(255)) ENGINE=MEMORY; 
    ->  DELETE FROM mynumber; 
    -> 
    ->  SET retval = 'nothing retrieved'; 
    ->  SET @query = CONCAT('INSERT INTO mynumber SELECT Name FROM ', @iTable, ' WHERE Value=''', @iValue, ''''); 
    ->  PREPARE QUERY FROM @query; 
    ->  EXECUTE QUERY; 
    ->  DEALLOCATE PREPARE QUERY; 
    ->  SELECT COUNT(1) INTO foundcount FROM mynumber; 
    ->  IF foundcount = 0 THEN 
    ->   SET @querytwo = CONCAT('INSERT INTO mynumber SELECT Name FROM ', @iTable, ' WHERE Value=''', @iValueTwo, ''''); 
    ->   PREPARE QUERY FROM @querytwo; 
    ->   EXECUTE QUERY; 
    ->   DEALLOCATE PREPARE QUERY; 
    ->  END IF; 
    ->  SELECT COUNT(1) INTO foundcount FROM mynumber; 
    ->  IF foundcount > 0 THEN 
    ->   SELECT rv INTO retval FROM mynumber; 
    ->  END IF; 
    ->  SELECT retval; 
    -> 
    -> END // 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 
mysql> 

好的我三次調用存儲過程。第一個什麼也得不到。第二個獲得第二個值。第三個獲得第一個值。

mysql> CALL myproc('mytable','pamela','diamond'); 
+-------------------+ 
| retval   | 
+-------------------+ 
| nothing retrieved | 
+-------------------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.02 sec) 

mysql> CALL myproc('mytable','pamela','wilkins'); 
+-----------+ 
| retval | 
+-----------+ 
| dominique | 
+-----------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.01 sec) 

mysql> CALL myproc('mytable','edge','wilkins'); 
+---------+ 
| retval | 
+---------+ 
| rolando | 
+---------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.02 sec) 

mysql> 

試試看!

+0

非常感謝羅蘭多!使用ENGINE = MEMORY;我最後需要擔心手動刪除它嗎?數據在每次執行後都會被清除還是我還必須處理這些? – user391986 2012-03-23 22:39:00

+0

TEMPORARY TABLE將自行清除數據庫連接是否正常斷開連接或意外終止。 – RolandoMySQLDBA 2012-03-28 15:38:06

1

在SQL Server中,你可以運行的結果到一個臨時表,然後檢查臨時表中的行這樣的:

declare @numberResults int = 0 

create table #MyTempTable(...) 

insert #MyTempTable 
sp_executesql Query 

set @numberResults = (select count(*) from #MyTempTable) 

if @numberResults = 0 
begin 
    sp_executesql secondQuery 
end 
1

在MySQL中,你可以使用內置的found_rows()的過程是這樣的:

[email protected]:~$ mysql -u root -p 
Enter password: 
mysql> use your_database; 
Database changed 
mysql> select id from problems; 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
+----+ 
4 rows in set (0.00 sec) 

mysql> select found_rows(); 
+--------------+ 
| found_rows() | 
+--------------+ 
|   4 | 
+--------------+ 
1 row in set (0.00 sec) 

在mssql中,您可以使用值@@rowcount。然後你可以運行僅在第一個查詢返回行的第二個查詢:

EXECUTE QUERY; 

IF @@rowcount = 0 
BEGIN 
    PREPARE QUERY FROM @querytwo;  
    EXECUTE QUERY; 
END 
+0

我不斷收到錯誤1193(HY000):未知的系統變量'rowcount' – user391986 2012-03-23 20:08:44

+0

MySql沒有@@ rowcount像sql服務器,你可以在這裏找到相當於http://stackoverflow.com/questions/2229218/what-is-mysql -version-of-rowcount – dmportella 2012-03-24 16:45:10

+0

主要使用的是Found_Rows(),你可以在這裏找到文檔http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows – dmportella 2012-03-24 16:51:56

相關問題