在构建过程时,得到错误"在此位置选择无效输入"

时间:2015-07-28 15:18:23

标签: mysql stored-procedures

认为这是一个常见问题,但在扫描过去一小时的采访后,显然没有。

简而言之,我试图将一个用于过程的常见查询。这是我到目前为止所拥有的。

DROP PROCEDURE IF EXISTS splitColumnsDelimiter;

CREATE PROCEDURE splitColumnsDelimiter(IN DELIMITER VARCHAR(5))
BEGIN
SELECT
  sometbl.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
FROM
  (SELECT 1 n UNION ALL SELECT 2
   UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
  ON CHAR_LENGTH(sometbl.name)
     -CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
ORDER BY
  id, n

END;

查询本身就像一个魅力。然而,似乎添加任何代码将其转换为程序会使我在工作台上使用弹出错误。从我在互联网上找到的例子来看,我应该(?)是好的,但显然不是,所以任何人都碰巧知道我可能被误入歧途,哪里可以开悟?这一点非常容易。

编辑:以下代码似乎至少消除了错误的发生。

DROP PROCEDURE IF EXISTS splitColumnsDelimiter;

DELIMITER //

CREATE PROCEDURE splitColumnsDelimiter()
BEGIN

SELECT
      sometbl.id,
      SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
    FROM
      (SELECT 1 n UNION ALL SELECT 2
       UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
      ON CHAR_LENGTH(sometbl.name)
         -CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
    ORDER BY
      id, n;

END //
DELIMITER ;

执行CALL splitColumnsDelimiter;现在按预期工作,返回我希望看到的SQL表返回。

1 个答案:

答案 0 :(得分:1)

尝试一下:

DELIMITER //
DROP PROCEDURE IF EXISTS splitColumnsDelimiter;
 CREATE PROCEDURE splitColumnsDelimiter()
   BEGIN

    SELECT
      sometbl.id,
      SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
    FROM
      (SELECT 1 n UNION ALL SELECT 2
       UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
      ON CHAR_LENGTH(sometbl.name)
         -CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
    ORDER BY
      id, n;

   END //
 DELIMITER ;

如果您打算为分隔符|添加一个参数,然后输入一个参数并使用它而不是硬编码,则不应将其称为DELIMITER

编辑:

我在你的comments that you are using workbench中读到,只需按照以下步骤定义:

 CREATE PROCEDURE splitColumnsDelimiter()
   BEGIN

    SELECT
      sometbl.id,
      SUBSTRING_INDEX(SUBSTRING_INDEX(sometbl.name, '|', numbers.n), '|', -1) name
    FROM
      (SELECT 1 n UNION ALL SELECT 2
       UNION ALL SELECT 3 UNION ALL SELECT 4) numbers INNER JOIN sometbl
      ON CHAR_LENGTH(sometbl.name)
         -CHAR_LENGTH(REPLACE(sometbl.name, '|', ''))>=numbers.n-1
    ORDER BY
      id, n;

   END

删除DELIMITERDROP声明