0

我几乎没有任何使用适当 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

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

提前致谢 :)

4

1 回答 1

1

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

    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。如上所示,它允许使用参数调用过程,根据需要更改数据库名称、表名称和列名称。

过程返回值,将存储在@a 变量中。

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

希望这会有所帮助。

于 2022-03-04T04:35:55.900 回答