mysql - HY000 准备好的语句包含引用同一语句的存储例程调用

标签 mysql sql cursor

当我执行调用 P_AGINGDATA('xxx'); 时。我收到以下错误:

Error Code: 1444 
The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner 

错误消息表明我无法调用引用同一语句的例程。但我没有!

这让我很头疼。 谁能给我一些建议?

我直接调用的过程

CREATE PROCEDURE P_AGINGDATA 
--
DECLARE CUR_AGING CURSOR FOR
SELECT ID,
       TABLE_NAME,
       COLUMN_NAME,
       AGING_OPTION,
       MAX_RESERVE_DAY,
       HISTORY_TABLE_NAME
  FROM t_cm_aging_config T
 WHERE T.RULE_VALID = 1
 ORDER BY ID;
  OPEN CUR_AGING;
  loop_label:
  LOOP
    FETCH CUR_AGING
      INTO V_ID, V_TABLE_NAME, V_COLUMN_NAME, V_AGING_OPTION, V_MAX_RESERVE_DAY, V_HISTORY_TABLE_NAME;
    IF NOT_FOUND = 1 THEN 
        LEAVE loop_label; 
    END IF;
      IF UPPER(V_AGING_OPTION) IN ('HISTORY', 'DELETE') THEN
         -- todo
      ELSEIF UPPER(V_AGING_OPTION) = 'EXECUTE' THEN
        SET @GetName = CONCAT('CALL ',V_TABLE_NAME,'(',V_MAX_RESERVE_DAY,');');
        PREPARE stmt FROM @GetName;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
      END IF;
  END LOOP loop_label;
  CLOSE CUR_AGING;
END $$

在上一个过程的循环中调用另一个过程

CREATE PROCEDURE P_CM_AGING_CUSTOMER ( IN v_max_reserve_day BIGINT )
BEGIN
    DECLARE v_days_from_1970         BIGINT;
    DECLARE v_start_unix_timestamp   BIGINT;
    DECLARE v_has_exception   INT;

    DECLARE EXIT HANDLER FOR SQLEXCEPTION SET v_has_exception = 1;

    CREATE TABLE IF NOT EXISTS TMP_OFFERING_INST_ID (OFFERING_INST_ID BIGINT(13));
    TRUNCATE TABLE TMP_OFFERING_INST_ID;

    SET @Insertofferinst = CONCAT('INSERT INTO TMP_OFFERING_INST_ID select offering_inst_id from t_cm_offer_inst t where status=''9'' and ACTIVE_FLAG=''0'' and '
     , ' CREATED_TIME < 86400000*(',ifnull(v_days_from_1970, ''),' - ',ifnull(v_max_reserve_day, ''),') and not exists (select 1 from t_cm_offer_inst a where t.customer_id=a.customer_id and (a.status<>''9'' or a.ACTIVE_FLAG<>''0''))');
    PREPARE stmt FROM @Insertofferinst;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    COMMIT;

    -- related data inserted into tmp table,start delete data
    SET @Deletedata = 'DELETE FROM T_CM_OFFER_INST_FEE WHERE OFFERING_INST_ID IN (SELECT OFFERING_INST_ID FROM TMP_OFFERING_INST_ID)';
    PREPARE stmt FROM @Deletedata;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    COMMIT;
END;
$$

最佳答案

错误提示

The prepared statement contains a stored routine call that refers to that same statement.

您已经准备好 STMT。 更改要执行的变量名称,尝试使用

PREPARE newSTMT  FROM @GetName;
EXECUTE newSTMT ;
DEALLOCATE PREPARE newSTMT ;

关于mysql - HY000 准备好的语句包含引用同一语句的存储例程调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53629702/

相关文章:

c# - 更改 css 样式表并将所选样式表保存到数据库

SQL 为每个属性添加总计行

php - 优化这个 mysql php 查询

php - 查询失败 您的 SQL 语法有误

sql - 如何从 ID 位于 ID 列表中的表中删除?

javascript - 用光标键左右移动div

java - java中如何检查光标类型?

postgresql - 在 Postgresql 中动态生成的 CURSOR

mysql - 在 Rails 中的不同表中搜索许多不同的列

php - 使用 Php 将数据插入 mysql 数据库时。我收到错误消息“整数值不正确 : '' for column 'rate' at row 1”