如何编写一个产生运行时错误的语法正确的MySQL表达式?

时间:2013-09-10 05:38:18

标签: mysql sql database

这与以下内容有关: How to write a short grammatically correct query that generates an error when run?

但是,在评估时,是否有一个简单的语法正确的表达式来生成运行时错误,而不是整个查询?

类似的东西:

SELECT IF(1=1, 1, <runtime_error_expression>); // successfully run
SELECT IF(1=2, 1, <runtime_error_expression>); // runtime error

2 个答案:

答案 0 :(得分:1)

<强>已更新

SELECT IF(1=1, 1, 9223372036854775807 + 1); 
SELECT IF(1=2, 1, 9223372036854775807 + 1); 

输出:

mysql> SELECT IF(1=1, 1, 9223372036854775807 + 1); 
+-------------------------------------+
| IF(1=1, 1, 9223372036854775807 + 1) |
+-------------------------------------+
|                                   1 |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF(1=2, 1, 9223372036854775807 + 1); 
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

如果经常使用它,那么您可以考虑创建一个生成错误的函数

CREATE FUNCTION GEN_ERROR() RETURNS INT
RETURN (SELECT a FROM non_table);

如果使用MySql 5.5及更高版本,则可以在函数中包含SIGNAL

DELIMITER $$
CREATE FUNCTION GEN_ERROR() RETURNS INT
BEGIN
  SIGNAL SQLSTATE '02000';
  RETURN 1;
END$$
DELIMITER ;

然后使用它

SELECT IF(1=1, 1, GEN_ERROR()); 
SELECT IF(1=2, 1, GEN_ERROR());

输出:

mysql> SELECT IF(1=1, 1, GEN_ERROR()); 
+-------------------------+
| IF(1=1, 1, GEN_ERROR()) |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> SELECT IF(1=2, 1, GEN_ERROR());
ERROR 1146 (42S02): Table 'test.non_table' doesn't exist

答案 1 :(得分:0)

您可以使用引发错误的过程和SIGNAL语句(MySQL 5.5)。例如 -

CREATE PROCEDURE procedure1()
BEGIN

  IF @var = 1 THEN
    SELECT * FROM DUAL;
  ELSE
    SIGNAL SQLSTATE '02001'; -- Error
  END IF;

END