2017-02-28 28 views
1

我有兩個函數。 set_credit_values和do_credit。我會從第一個裏面打第二個。然後它得到錯誤1 errors were found during analysis.Unexpected character. (near ":" at position 983),#1415 - Not allowed to return a result set from a function。我的代碼如下Mysql在另一個函數裏面調用函數

  DROP FUNCTION IF EXISTS do_credit; 

      DELIMITER $$; 
      CREATE FUNCTION do_credit (ltp_id int, cr_count tinyint, cr_on tinyint, next_cr date, cr_period tinyint) 
      RETURNS INT DETERMINISTIC 
      BEGIN 

       INSERT IGNORE INTO aaa_test(aaa_ltp_id, aaa_cr_count, aaa_cr_on, aaa_next_cr, aaa_cr_period) VALUES 
       (ltp_id, cr_count, cr_on, next_cr, cr_period); 
       RETURN LAST_INSERT_ID(); 

      END $$; 
      DELIMITER ; 

      DROP FUNCTION IF EXISTS set_credit_values; 

      DELIMITER $$; 
      CREATE FUNCTION set_credit_values (emp_id bigint, lpc_id int, elp_date date) RETURNS boolean DETERMINISTIC 
      BEGIN 

       DECLARE ltp_id INT(11) DEFAULT 0; 
       DECLARE cr_count tinyint(4) DEFAULT 0; 
       DECLARE cr_on tinyint(1) DEFAULT 0; 
       DECLARE next_cr DATE DEFAULT NULL; 
       DECLARE cr_period tinyint(4) DEFAULT 0; 

       DECLARE v_finished INT(11) DEFAULT 0; 

       DEClARE cur_set_credit CURSOR FOR      
       SELECT lpb_fk_leave_type, lpb_cr_count, lpb_cr_on, lpb_next_cr, lpb_cr_period FROM erp_leave_policy_body 
       WHERE lpb_fk_leave_policy = lpc_id; 

       DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; 

       OPEN cur_set_credit; 

        get_cr: LOOP 

         FETCH cur_set_credit INTO ltp_id, cr_count, cr_on, next_cr, cr_period; 

         IF v_finished = 1 THEN 
         LEAVE get_cr; 
         END IF; 

         SELECT do_credit(ltp_id, cr_count, cr_on, next_cr, cr_period) FROM DUAL; 


        END LOOP get_cr; 

       CLOSE cur_set_credit; 

       RETURN 1; 
      END $$; 
      DELIMITER ; 

它成功地工作我,如果我寫的裏面set_credit_values功能插入查詢,而不調用do_credit功能如下

  DROP FUNCTION IF EXISTS set_credit_values; 

      DELIMITER $$; 
      CREATE FUNCTION set_credit_values (emp_id bigint, lpc_id int, elp_date date) RETURNS boolean DETERMINISTIC 
      BEGIN 

       DECLARE ltp_id INT(11) DEFAULT 0; 
       DECLARE cr_count tinyint(4) DEFAULT 0; 
       DECLARE cr_on tinyint(1) DEFAULT 0; 
       DECLARE next_cr DATE DEFAULT NULL; 
       DECLARE cr_period tinyint(4) DEFAULT 0; 

       DECLARE v_finished INT(11) DEFAULT 0; 

       DEClARE cur_set_credit CURSOR FOR      
       SELECT lpb_fk_leave_type, lpb_cr_count, lpb_cr_on, lpb_next_cr, lpb_cr_period FROM erp_leave_policy_body 
       WHERE lpb_fk_leave_policy = lpc_id; 

       DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; 

       OPEN cur_set_credit; 

        get_cr: LOOP 

         FETCH cur_set_credit INTO ltp_id, cr_count, cr_on, next_cr, cr_period; 

         IF v_finished = 1 THEN 
         LEAVE get_cr; 
         END IF; 

         INSERT IGNORE INTO aaa_test(aaa_ltp_id, aaa_cr_count, aaa_cr_on, aaa_next_cr, aaa_cr_period) VALUES 
       (ltp_id, cr_count, cr_on, next_cr, cr_period); 


        END LOOP get_cr; 

       CLOSE cur_set_credit; 

       RETURN 1; 
      END $$; 
      DELIMITER ; 

但我需要它做do_credit功能因爲我需要用這個做一些其他的查詢。所以請任何人幫忙

回答

0

如下代碼中所提及的那樣,請致電DECLARE one VARIABLE,並在調用函數後使用INTO關鍵字獲得該變量中的返回值。 希望這會幫助你。

DROP FUNCTION IF EXISTS do_credit; 

       DELIMITER $$; 
       CREATE FUNCTION do_credit (ltp_id int, cr_count tinyint, cr_on tinyint, next_cr date, cr_period tinyint) 
       RETURNS INT DETERMINISTIC 
       BEGIN 

        INSERT IGNORE INTO aaa_test(aaa_ltp_id, aaa_cr_count, aaa_cr_on, aaa_next_cr, aaa_cr_period) VALUES 
        (ltp_id, cr_count, cr_on, next_cr, cr_period); 
        RETURN LAST_INSERT_ID(); 

       END $$; 
       DELIMITER ; 

       DROP FUNCTION IF EXISTS set_credit_values; 

       DELIMITER $$; 
       CREATE FUNCTION set_credit_values (emp_id bigint, lpc_id int, elp_date date) RETURNS boolean DETERMINISTIC 
       BEGIN 

        DECLARE ltp_id INT(11) DEFAULT 0; 
        DECLARE var_id INT(11) DEFAULT 0; <--Declare this variable 
        DECLARE cr_count tinyint(4) DEFAULT 0; 
        DECLARE cr_on tinyint(1) DEFAULT 0; 
        DECLARE next_cr DATE DEFAULT NULL; 
        DECLARE cr_period tinyint(4) DEFAULT 0; 

        DECLARE v_finished INT(11) DEFAULT 0; 

        DEClARE cur_set_credit CURSOR FOR      
        SELECT lpb_fk_leave_type, lpb_cr_count, lpb_cr_on, lpb_next_cr, lpb_cr_period FROM erp_leave_policy_body 
        WHERE lpb_fk_leave_policy = lpc_id; 

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; 

        OPEN cur_set_credit; 

         get_cr: LOOP 

          FETCH cur_set_credit INTO ltp_id, cr_count, cr_on, next_cr, cr_period; 

          IF v_finished = 1 THEN 
          LEAVE get_cr; 
          END IF; 

          SELECT do_credit(ltp_id, cr_count, cr_on, next_cr, cr_period) into var_id FROM DUAL; <--get return value in declared variable> 


         END LOOP get_cr; 

        CLOSE cur_set_credit; 

        RETURN 1; 
       END $$; 
       DELIMITER ; 
+0

Yessssss !!!!!! – Sam