问题描述
这花了一些工夫,但我做了足够的调整。您的代码问题与您的逻辑无关,但与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>
试试看 !!!
解决方法
我正在使用MySQL数据库并尝试创建存储过程。我怎样才能做到,如果query1的结果没有记录,那么它将执行一个不同的查询?
这是我到目前为止的内容:
/* 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 ',@iValueTwo,'"');
PREPARE QUERY FROM @query;
EXECUTE QUERY;
END //
delimiter ;
/* CALL */
call myproc("mydata","testvalue","");
我想运行一个查询,并且仅在第一个没有行的情况下才执行第二个查询。做这个的最好方式是什么?