mysql - 如何使用 ALTER 语句与 GENERATE ALWAYS INSIDE mysql 函数?

标签 mysql stored-functions

json 数组驻留在我的表产品的 Product_details 列中

{
"email":"test@test.com",
"street_address#1":"street1",
"street_address#2":"street2",
"given_name":"test",
"products": [ 
                { "product": "product1", "status": "available"},
                { "product": "product2", "status": "not-available"} 
            ]
}

我的 mysql 函数中的 alter table 不起作用。

感谢任何帮助。

mysql函数如下:

DROP FUNCTION IF EXISTS CREATE_COLUMN;
CREATE FUNCTION CREATE_COLUMN(PRODUCT_ID INT) 
RETURNS MEDIUMTEXT
BEGIN
    DECLARE PRODUCTS, STATUS MEDIUMTEXT;
    DECLARE SINGLE_PRODUCT, SINGLE_STATUS, COL_NAME, COL_VALUE MEDIUMTEXT;
    DECLARE indx INT DEFAULT 0;
        SELECT json_unquote(json_extract(product_details, '$.products[*].product')) INTO PRODUCTS FROM product WHERE product_id = PRODUCT_ID;
        SELECT json_unquote(json_extract(product_details, '$.products[*].status')) INTO STATUS FROM product WHERE product_id = PRODUCT_ID;

        REPEAT
            SET SINGLE_PRODUCT = JSON_EXTRACT(PRODUCTS, CONCAT("$[", indx, "]"));
            SET SINGLE_STATUS = JSON_EXTRACT(STATUS, CONCAT("$[", indx, "]"));
            SET COL_NAME = CONCAT('"','view_products_', TRIM(BOTH '"' FROM SINGLE_PRODUCT), '"');
            SET COL_VALUE = SINGLE_STATUS;

        # This query is not working
            ALTER TABLE product ADD COLUMN COL_NAME varchar(127) GENERATED ALWAYS AS (COL_VALUE) VIRTUAL;

            SET indx = indx + 1;
            UNTIL indx = JSON_LENGTH(PRODUCTS)
       END REPEAT;
    RETURN COL_NAME;
END;

SELECT CREATE_COLUMN (001);

最佳答案

https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html说:

SQL syntax for prepared statements can be used within stored procedures, but not in stored functions or triggers.

https://dev.mysql.com/doc/refman/8.0/en/stored-program-restrictions.html说:

The following additional statements or operations are not permitted within stored functions.

  • Statements that perform explicit or implicit commit or rollback.

(ALTER TABLE 执行隐式提交。)

我不知道你想做什么,但你需要考虑一种不同的方法。

我建议您不要以这种方式使用 JSON。将产品数据存储在普通列中,您就不必使用生成的列执行所有这些复杂的操作。

关于mysql - 如何使用 ALTER 语句与 GENERATE ALWAYS INSIDE mysql 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56426540/

相关文章:

MYSQL 显示大小写值,即使数据库中不存在该大小写

sql-server - 用户定义的函数 sql,关键字 'return' 附近的语法不正确

oracle - 我可以在 PL/SQL 中返回一个函数吗?

php - 如何将 php if 语句添加到我的表单中

php - "self-referencing"表和数组

mysql - 我正在尝试使用 CakePHP 和 MySQL 找到一种 "simple"存储图像(以及有关图像的数据)的方法。这段代码让我有点困惑

postgresql - 用 2 列的多条记录构造一个字符串

mysql 使用 phpmyadmin 调用存储过程中的函数

mysql - 如何创建 MySQL 存储聚合函数?

php - 在 php 中使用 PDO 类获取 num_rows 的问题