Prepared statement needs to be re-prepared in mysql - mysql

I'm trying to access data from view and insert into a temptable, inside a store procedure, below is the store procedure .
When I try to execute the sp I'm getting "Prepared statement needs to be re-prepared" error.
Can some one pls suggest how to fix this error in mysql.
Procedure:
DROP PROCEDURE IF EXISTS getFilteredData;
CREATE PROCEDURE getFilteredData()
BEGIN
DECLARE sql2 VARCHAR(5000);
DROP TEMPORARY TABLE IF EXISTS TempTbl;
CREATE TEMPORARY TABLE TempTbl
(
ID VARCHAR(50),
Name VARCHAR(500),
Status INT
);
SET sql2 = 'INSERT INTO TempTbl Select ID,Name,Id as Status from v_release;';
SET #SWV_Stmt = sql2;
PREPARE SWT_Stmt FROM #SWV_Stmt;
EXECUTE SWT_Stmt;
DEALLOCATE PREPARE SWT_Stmt;
SELECT * FROM TempTbl;
END;

I can't reproduce the problem that you report.
mysql> SELECT VERSION();
+-----------------+
| VERSION() |
+-----------------+
| 5.5.22-0ubuntu1 |
+-----------------+
1 row in set (0.00 sec)
mysql> DELIMITER //
mysql> DROP TABLE IF EXISTS `release`//
Query OK, 0 rows affected (0.00 sec)
mysql> DROP VIEW IF EXISTS `v_release`//
Query OK, 0 rows affected (0.00 sec)
mysql> DROP PROCEDURE IF EXISTS `getFilteredData`//
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `release` (
-> `id` VARCHAR(50),
-> `name` VARCHAR(500),
-> `status` INT
-> )//
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE VIEW `v_release` AS
-> SELECT `id`, `name`, `status`
-> FROM `release`//
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `release`
-> (`id`, `name`, `status`)
-> VALUES
-> ('1', 'NAME1', 1),
-> ('2', 'NAME2', 2),
-> ('3', 'NAME1', 3)//
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> CREATE PROCEDURE `getFilteredData`()
-> BEGIN
-> DROP TEMPORARY TABLE IF EXISTS `temptbl`;
-> CREATE TEMPORARY TABLE `temptbl` (
-> `id` VARCHAR(50),
-> `name` VARCHAR(500),
-> `status` INT);
-> PREPARE `stmt` FROM 'INSERT INTO `temptbl`
'> SELECT `id`, `name`, `status`
'> FROM `v_release`';
-> EXECUTE `stmt`;
-> DEALLOCATE PREPARE `stmt`;
-> SELECT `id`, `name`, `status`
-> FROM `temptbl`;
-> DROP TEMPORARY TABLE IF EXISTS `temptbl`;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `getFilteredData`;
+------+-------+--------+
| id | name | status |
+------+-------+--------+
| 1 | NAME1 | 1 |
| 2 | NAME2 | 2 |
| 3 | NAME1 | 3 |
+------+-------+--------+
3 rows in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
SQL Fiddle demo

Related

Trigger to create varchar auto increment with if else statement

Hi Does anybody know how I should create a trigger that will create a unique id from varchar and auto increment table including if else from user input
I was planning something similar to the below code but i am getting an error 1050 table user_increment_table exist
DELIMITER ;
CREATE TRIGGER TG_ID
BEFORE INSERT ON userdatabase
FOR EACH ROW
BEGIN
if User_department like "HR"
then
INSERT INTO user_increment_table VALUES (NULL);
SET NEW.User_ID = CONCAT('HRU', LPAD(LAST_INSERT_ID(), 3, '0'));
Elseif U_role like "MARKETING"
then
INSERT INTO user_increment_table VALUES (NULL);
SET NEW.User_ID = CONCAT('MRK', LPAD(LAST_INSERT_ID(), 3, '0'));
END$$
DELIMITER ;
Try:
mysql> DROP TABLE IF EXISTS `user_increment_table`, `userdatabase`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `userdatabase` (
-> `User_ID` VARCHAR(6),
-> `User_department` VARCHAR(255),
-> `U_role` VARCHAR(255)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `user_increment_table` (
-> `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE TRIGGER `TG_ID` BEFORE INSERT ON `userdatabase`
-> FOR EACH ROW
-> BEGIN
-> IF NEW.`User_department` LIKE 'HR' THEN
-> INSERT INTO `user_increment_table` VALUES (NULL);
-> SET NEW.`User_ID` := CONCAT('HRU', LPAD(LAST_INSERT_ID(), 3, '0'));
-> ELSEIF NEW.`U_role` LIKE 'MARKETING' THEN
-> INSERT INTO user_increment_table VALUES (NULL);
-> SET NEW.`User_ID` := CONCAT('MRK', LPAD(LAST_INSERT_ID(), 3, '0'));
-> END IF;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> INSERT INTO `userdatabase` (`User_department`)
-> VALUES ('HR');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `userdatabase` (`U_role`)
-> VALUES ('MARKETING');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT
-> `User_ID`,
-> `User_department`,
-> `U_role`
-> FROM
-> `userdatabase`;
+---------+-----------------+-----------+
| User_ID | User_department | U_role |
+---------+-----------------+-----------+
| HRU001 | HR | NULL |
| MRK002 | NULL | MARKETING |
+---------+-----------------+-----------+
2 rows in set (0.00 sec)
See db-fiddle.

mysql Transaction in the commit block

CREATE DEFINER=`root`#`localhost` PROCEDURE `PrcCopyQuestion_Admin`(in Param1,in Param2 varchar(45))
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
Select 'Fail' as 'Status' ;
END;
DECLARE EXIT HANDLER FOR sqlwarning
BEGIN
ROLLBACK;
Select 'Fail' as 'Status' ;
END;
Start transaction;
Insert statement 1;
Insert statement 2;
SELECT 'Success' AS 'Status';
call PrcGetQuestionAndOption_Admin(#variable);
Commit;
END
I am using Mysql 5.7. When in the commit block if the second (Insert statement 2) fails. It will go in the Rollback part and gives me output as 'Failed'. But when i am getting the output it still executes the Select 'Success' as Status in commit block.
So my question is when the second insert statement fails. It should go directly in rollback and give me status as fail. It should not execute the status as 'success' in commit block.
Eg: On rollback I am getting two result set:
Select 'Fail'..1st result set
Select 'Success'....2nd result set
I need output as only
Select 'fail'
Any help appreciated!!
I can't reproduce the problem.
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.12 |
+-----------+
1 row in set (0.00 sec)
mysql> DROP TABLE IF EXISTS `t1`, `t2`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `t1` (
-> `c0` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `t2` (
-> `c0` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> DROP PROCEDURE IF EXISTS `PrcCopyQuestion_Admin`//
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE PROCEDURE `PrcCopyQuestion_Admin`(Param1 INT, Param2 VARCHAR(45))
-> BEGIN
-> DECLARE EXIT HANDLER FOR SQLEXCEPTION
-> BEGIN
-> ROLLBACK;
-> SELECT 'Fail' Status;
-> END;
-> DECLARE EXIT HANDLER FOR SQLWARNING
-> BEGIN
-> ROLLBACK;
-> SELECT 'Fail' Status;
-> END;
-> START TRANSACTION;
-> INSERT INTO `t1` (`c0`) VALUES (0);
-> IF Param1 = 0 THEN
-> INSERT INTO `ERR_t2` (`c0`) VALUES (0);
-> ELSE
-> INSERT INTO `t2` (`c0`) VALUES (0);
-> END IF;
-> SELECT 'Success' Status;
-> COMMIT;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `PrcCopyQuestion_Admin`(0, NULL);
+--------+
| Status |
+--------+
| Fail |
+--------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t1`;
Empty set (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t2`;
Empty set (0.00 sec)
mysql> CALL `PrcCopyQuestion_Admin`(1, NULL);
+---------+
| Status |
+---------+
| Success |
+---------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t1`;
+----+
| c0 |
+----+
| 2 |
+----+
1 row in set (0.00 sec)
mysql> SELECT
-> `c0`
-> FROM
-> `t2`;
+----+
| c0 |
+----+
| 1 |
+----+
1 row in set (0.00 sec)

MYSQL - SELECT data from dynamic table names

Imagine that I have several dynamic table names such as :
select table_name
from INFORMATION_SCHEMA.TABLES
where table_name like 'ifhcraw%';
ifhcraw_2016_03_25_13
ifhcraw_2016_03_26_19
ifhcraw_2016_03_28_2
And I don't found any rule on names. To find last edited table I have just select last modified table with query :
select table_name
from INFORMATION_SCHEMA.TABLES
where table_name like 'ifhcraw%' and
update_time = (select max(update_time)
from INFORMATION_SCHEMA.TABLES
where table_name like 'ifhcraw%');
Now the purpose all of this step to get data from table_name.
I have tried to use variables , however it was failed. For example :
SET #query1 := 'select table_name
from INFORMATION_SCHEMA.TABLES
where table_name like \'ifhcraw%\' and
update_time = (select max(update_time)
from INFORMATION_SCHEMA.TABLES
where table_name like \'ifhcraw%\') ';
SET #query2 := concat('select *
from ', #query1);
PREPARE stmt from #query2;
execute stmt;
Please help to solve issue.
Try:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.11 |
+-----------+
1 row in set (0.00 sec)
mysql> DROP TABLE IF EXISTS `ifhcraw_2016_03_25_13`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `ifhcraw_2016_03_26_19`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `ifhcraw_2016_03_28_2`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `ifhcraw_2016_03_25_13` (
-> `id` INT
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `ifhcraw_2016_03_26_19` (
-> `id` INT
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `ifhcraw_2016_03_28_2` (
-> `id` INT
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> SET #`TABLE_NAME` := NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT `TABLE_NAME` INTO #`TABLE_NAME`
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
-> `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%'
-> );
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> SELECT #`TABLE_NAME`;
+---------------+
| #`TABLE_NAME` |
+---------------+
| NULL |
+---------------+
1 row in set (0.00 sec)
mysql> SET #`qry` := IF(#`TABLE_NAME` IS NULL,
-> 'SELECT NULL',
-> CONCAT('SELECT * FROM ', #`TABLE_NAME`));
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE `stmt` FROM #`qry`;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE `stmt`;
+------+
| NULL |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
mysql> DEALLOCATE PREPARE `stmt`;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `ifhcraw_2016_03_26_19`
-> (`id`)
-> VALUES
-> (1);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `TABLE_NAME` INTO #`TABLE_NAME`
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
-> `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%'
-> );
Query OK, 1 row affected (0.00 sec)
mysql> SELECT #`TABLE_NAME`;
+-----------------------+
| #`TABLE_NAME` |
+-----------------------+
| ifhcraw_2016_03_26_19 |
+-----------------------+
1 row in set (0.00 sec)
mysql> SET #`qry` := IF(#`TABLE_NAME` IS NULL,
-> 'SELECT NULL',
-> CONCAT('SELECT * FROM ', #`TABLE_NAME`));
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE `stmt` FROM #`qry`;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE `stmt`;
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
mysql> DEALLOCATE PREPARE `stmt`;
Query OK, 0 rows affected (0.00 sec)
UPDATE
Care should be taken when there are two or more tables that match the criteria, will fail as follows:
mysql> INSERT INTO `ifhcraw_2016_03_26_19`
-> (`id`)
-> VALUES
-> (1);
Query OK, 1 row affected (0,00 sec)
mysql> INSERT INTO `ifhcraw_2016_03_28_2`
-> (`id`)
-> VALUES
-> (1);
Query OK, 1 row affected (0,00 sec)
mysql> SELECT `TABLE_NAME`
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
-> `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%'
-> );
+-----------------------+
| TABLE_NAME |
+-----------------------+
| ifhcraw_2016_03_26_19 |
| ifhcraw_2016_03_28_2 |
+-----------------------+
2 rows in set (0,00 sec)
mysql> SELECT `TABLE_NAME` INTO #`TABLE_NAME`
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
-> `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
-> FROM `INFORMATION_SCHEMA`.`TABLES`
-> WHERE `TABLE_NAME` LIKE 'ifhcraw%'
-> );
ERROR 1172 (42000): Result consisted of more than one row
You should handle the case as you deem appropriate.

setting variable in case of exception

I have a stored procedure which will set my customized error as well as set an out variable to some value . I tried the following procedure .
***delimiter //
drop procedure if exists test_dalpu //
create procedure test_dalpu(out out_value int)
begin
DECLARE EXIT HANDLER FOR SQLSTATE '22001'
BEGIN
set out_value = 1;
SIGNAL SQLSTATE '22001' SET
MYSQL_ERRNO = 2,
MESSAGE_TEXT = 'Too long ';
END;
insert into abc_test values ( 5,"eerrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr");***
end//
delimiter ;
Then after executing
**call test_dalpu(#out_value);**
I got the correct output as Error code 2 Too long as expected, But after that If I do
select #out_value;
Am getting the value as null instead of 1 .
Is it the correct way?
Try:
mysql> DROP PROCEDURE IF EXISTS `test_dalpu`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `abc_test`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `abc_test` (
-> `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> `description` CHAR(10)
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE `test_dalpu`(`out_value` VARCHAR(64))
-> BEGIN
-> DECLARE EXIT HANDLER FOR SQLSTATE '22001'
-> BEGIN
-> ROLLBACK;
-> SET #`set_variable` := CONCAT('SET #`', `out_value`, '` := 1');
-> PREPARE `stmt` FROM #`set_variable`;
-> EXECUTE `stmt`;
-> DEALLOCATE PREPARE `stmt`;
-> SIGNAL SQLSTATE '22001' SET
-> MYSQL_ERRNO = 2,
-> MESSAGE_TEXT = 'Too long';
-> END;
-> START TRANSACTION;
-> INSERT INTO `abc_test`
-> (`description`)
-> VALUES
-> ('ABCDEFGHIJK');
-> COMMIT;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> SET #`out_value` := NULL;
Query OK, 0 rows affected (0.00 sec)
mysql> CALL `test_dalpu`('out_value');
ERROR 2 (22001): Too long
mysql> SHOW WARNINGS;
+-------+------+----------+
| Level | Code | Message |
+-------+------+----------+
| Error | 2 | Too long |
+-------+------+----------+
1 row in set (0.00 sec)
mysql> SELECT #`out_value`;
+--------------+
| #`out_value` |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)

Run a query in a MySQL stored procedure if a condition is true

I am using MySQL database and trying to create a stored procedure. How can I make it so that if the result of query1 has no records, then it execute a different query?
Here is what I have so far:
/* 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", "");
I want to run a query, and execute a secondary query only if the first has no rows. What is the best way to do this?
This took some work but I made enough adjustments. The problem with your code has nothing to do with your logic but with MySQL Stored Procedure Language itself. When doing dynamic SQL It has scoping issues.
What I did was create a temp table and deposited the returned value in it
Here is some sample data loaded
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>
Here is the stored procedure adjusted to catch the return values in a temp table
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>
OK I called the stored procedure three time. The first gets nothing. The second gets the second value. The third gets the first value.
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>
Give it a Try !!!
In mysql you can use the found_rows() built in procedure like this:
el#apollo:~$ 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)
In mssql you can use the value ##rowcount. Then you can run the second query only if the first query returned no rows:
EXECUTE QUERY;
IF ##rowcount = 0
BEGIN
PREPARE QUERY FROM #querytwo;
EXECUTE QUERY;
END
In Sql Server, you could run the results into a temporary table and then check the temp table for rows like this:
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
My simplest working code
BEGIN
IF test = 'null' THEN
PREPARE QUERY FROM 'SELECT username as name from login';
EXECUTE QUERY;
ELSE
PREPARE QUERY FROM 'SELECT username as name2 from login';
EXECUTE QUERY;
END IF;
END