等待条件达到 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”
希望这会有所帮助。
我几乎没有任何适当的经验 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”
希望这会有所帮助。