3

这与以下内容有关: 如何编写一个语法正确的简短查询,在运行时会产生错误?

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

就像是:

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

2 回答 2

1

更新

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

输出:

mysql> 选择 IF(1=1, 1, 9223372036854775807 + 1);
+--------------------------------------------------+
| IF(1=1, 1, 9223372036854775807 + 1) |
+--------------------------------------------------+
| 1 |
+--------------------------------------------------+
一组中的 1 行(0.00 秒)

mysql> 选择 IF(1=2, 1, 9223372036854775807 + 1);
错误 1690 (22003):BIGINT 值超出“(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 行(0.00 秒)

mysql> SELECT IF(1=2, 1, GEN_ERROR());
错误 1146 (42S02):表 'test.non_table' 不存在
于 2013-09-10T05:57:46.267 回答
0

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

CREATE PROCEDURE procedure1()
BEGIN

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

END
于 2013-09-10T06:07:06.550 回答