首页 > 解决方案 > 如何创建一个空视图(或数组)并稍后在其中插入数据?

问题描述

这是因为我正在创建一个生成项目的过程(通过调用另一个函数),然后最终需要返回给我一个包含所有值的数组类型的集合。

我想我可以用一个临时表或视图来做到这一点。

DROP PROCEDURE IF EXISTS getAllStrings $$
CREATE PROCEDURE getAllStrings(IN idString varchar(256), OUT finalSeparate VARCHAR(256)) 
    BEGIN
        SELECT LENGTH(idString) - LENGTH(REPLACE(idString, ',', '')) INTO @noOfCommas;
               IF  @noOfCommas = 0 
              THEN 
                     SELECT idString;
              ELSE 
                    CREATE OR REPLACE VIEW v AS SELECT NULL AS SPLIT_VALUES WHERE FALSE;
                    SET @y = 1;
                    WHILE @y  <= @noOfCommas DO 
                       SELECT splitString(idString, ', ', @y) INTO @tempSeparate; 
                       SET  @y = @y + 1; 
                       INSERT INTO v (SPLIT_VALUES) values(@tempSeparate);
                    END WHILE; 
                    SELECT SPLIT_VALUES FROM v;
        END IF; 
END $$

它说

目标表 v 不可插入

我该怎么做?我什至尝试将算法更改为,merge但没有奏效。

有表的可以,但我正在寻找一种可以更好地保存它的数据结构,也许是@json,我不知道。

DELIMITER $$
DROP FUNCTION IF EXISTS splitString $$
CREATE FUNCTION splitString (
        x VARCHAR(255),
        delim VARCHAR(12),
        pos INT
        )
        RETURNS VARCHAR(255) deterministic
        RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
         LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
         delim, '') $$
DROP PROCEDURE IF EXISTS getAllStrings $$
CREATE PROCEDURE getAllStrings(IN idString varchar(256), OUT finalSeparate VARCHAR(256)) 
    BEGIN
        SELECT LENGTH(idString) - LENGTH(REPLACE(idString, ', ', '')) INTO @noOfCommas;
               IF  @noOfCommas = 0 
              THEN 
                     SELECT idString;
              ELSE 
                    DROP TABLE IF EXISTS TEMP_SEP_STRINGS;
                    CREATE TABLE IF NOT EXISTS TEMP_SEP_STRINGS( SPLIT_VALUES VARCHAR(256));
                    SET @y = 1;
                    WHILE @y  <= @noOfCommas DO 
                       SELECT splitString(idString, ', ', @y) INTO @tempSeparate; 
                       SET  @y = @y + 1; 
                       INSERT INTO TEMP_SEP_STRINGS(SPLIT_VALUES) values(@tempSeparate);
                    END WHILE; 
                    SELECT * FROM TEMP_SEP_STRINGS;
        END IF; 
END $$
CALL getAllStrings('b, a', @multiple);

标签: mysqlsqlstored-proceduresview

解决方案


临时表对我来说是最好的选择。当会话结束或连接关闭时,它会被释放(尽管您可以在此之前将其删除)并且只会吞噬您提供的任何数据。

无需定义其列和内容,您可以通过SELECT命令(例如SQL IN操作员)在任何地方使用它。

一个例子:

CREATE TEMPORARY TABLE temp_table
SELECT tree_id FROM TREES WHERE fruit_type='Apple';

推荐阅读