等待条件达到 return 的函数

function that waits until condition to return

我几乎没有任何适当的经验 SQL 但我一直在尝试编写一个数据库函数,该函数等待直到满足条件然后释放线程,以便我可以随时调用该函数等到满足那个条件。条件告诉我,一个单独的服务目前没有处理我想要访问的数据,但为了开发,我创建了一个无用的条目,我只想手动删除它以进行测试。

到目前为止,这是我的代码,但我无法让它工作。对于开发,我尝试在数据库管理器中执行它,就像我执行 SELECT 语句:

SET @c = 1;
WHILE @c > 0 DO
    SELECT COUNT(*) INTO @c FROM pb_db_operational.application_parameter WHERE `key` = "waitingtest";

    IF @c > 0
        SELECT SLEEP(5);
    END IF;
END WHILE;

SELECT 'asdf' FROM accessory_complete_price_factor LIMIT 1

我还尝试创建一个过程,因为当 运行 它在存储过程之外时我无法使用 DECLARE 语句:

CREATE FUNCTION `WaitUntilDataReady`()
RETURNS TINYINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN

DECLARE v_count INTEGER DEFAULT 1

WHILE v_count > 0 DO
    set v_count = (SELECT COUNT(*) FROM pb_db_operational.application_parameter WHERE `key` = "waitingtest")

    IF v_count > 0
        SELECT SLEEP(5)
    END IF
END WHILE

RETURN 1;

END

我无法得到我的任何一个示例 运行,所以我很高兴你能告诉我每一条信息,即使它只是基本语法。

提前致谢:)

您应该使用以下示例尝试存储过程:

    DROP PROCEDURE IF EXISTS pb_db_operational.WaitUntilDataReady ;
    
    DELIMITER //
    CREATE PROCEDURE pb_db_operational.WaitUntilDataReady(
      IN p_db_name VARCHAR(100),
      IN p_tab_name VARCHAR(100),
      IN p_col_name VARCHAR(100),  
      IN p_key VARCHAR(255),
      INOUT p_return_value INT
    )
    SQL SECURITY DEFINER
    BEGIN
      SET @v_count := 1 ;
      SET @req_sql := CONCAT("SELECT COUNT(*) INTO @v_count FROM ", p_db_name, ".", p_tab_name, " WHERE ", p_col_name, " = '", p_key, "' ; ") ;
      WHILE @v_count > 0 DO
        EXECUTE IMMEDIATE @req_sql ;
        IF @v_count > 0 THEN
          SELECT SLEEP(5) ;
        END IF ;
      END WHILE ;
      SET p_return_value := 1 ;
    END//
    DELIMITER ;
    
    
    SET @a:=0 ;
    CALL pb_db_operational.WaitUntilDataReady('pb_db_operational', 'application_parameter', 'v_key', 'waiting_test', @a) ;
    SELECT @a ;

存储过程允许使用动态 SQL。正如您在上面看到的,它允许使用参数调用过程,根据需要更改数据库名称、table 名称和列名称。

程序return的值,会保存在@a变量中。

建议:避免使用保留字作为对象名(变量、数据库、table、列等),如“key”

希望这会有所帮助。