簡體   English   中英

如何在 function 中正確寫入 cursor?

[英]How to properly write a cursor inside a function?

我需要你的幫助,因為我有點迷路了。 我試圖在谷歌上查看函數中的游標和關於這些的引用,但我似乎無法完全理解這個概念。 我有一個家庭作業,我需要:

  • 創建一個我使用游標的函數
  • 該條目是工資增長的百分比(例如:5% 是 0.05)
  • 函數需要用新增加的價格更新工資
  • 顯示新的平均工資
  • 並處理可能的錯誤

這是我到目前為止所做的......

你能幫我解決提示的問題,或者至少是函數中游標的簡單示例/資源,這樣我就可以開始更好地掌握這個概念。

DROP FUNCTION IF EXISTS Program;
DELIMITER //
CREATE FUNCTION Program(IncSal DECIMAL(3,2))
RETURNS DECIMAL(8,2)
DETERMINISTIC
    BEGIN
        DECLARE Salaire DECIMAL (8,2);
        DECLARE end BOOLEAN DEFAULT FALSE;
        DECLARE CurSalary CURSOR FOR
            SELECT Sala_EMPL
                        FROM EMPLOYE;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET end = TRUE;      

        OPEN CurSalary;
            loop_cursor: LOOP
                IF end THEN 
                    LEAVE loop_cursor; 
                END IF;
                UPDATE EMPLOYE
                SET Sala_EMPL=(Sala_EMPL*IncSal);
            END LOOP;
        CLOSE CurSalary;

        RETURN AVG(CurSalary);
    END; 
    //
    DELIMITER ;

If you use a cursor you have to FETCH from the cursor (please review https://dev.mysql.com/doc/refman/8.0/en/fetch.html ) without a fetch the loop is infinite. AVG 是一個聚合 function,您不能在 cursor 上進行 AVG(您需要 select..from)。 每次迭代 cursor 循環時,您的更新語句將適用於所有員工(邏輯上很荒謬)。 就我個人而言,我永遠不會使用 function,因為您嘗試做的事情在 function 中並不合適(我會使用程序)。

“工作”但錯誤的示例 function

DROP FUNCTION IF EXISTS f;
DELIMITER //
CREATE FUNCTION f(IncSal DECIMAL(3,2))
RETURNS DECIMAL(8,2)
DETERMINISTIC
    BEGIN
        DECLARE Salaire DECIMAL (8,2);
        DECLARE end BOOLEAN DEFAULT FALSE;
        DECLARE CurSalary CURSOR FOR
        SELECT salary FROM EMPLOYEe;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET end = TRUE;      

        OPEN CurSalary;
            loop_cursor: LOOP
                 fetch cursalary into salaire;
                IF end THEN 
                    LEAVE loop_cursor; 
                END IF;
                UPDATE EMPLOYEe
                            SET Salary=salary + (salary*incsal);
            END LOOP;
        CLOSE CurSalary;

        #RETURN AVG(CurSalary);
        return (select avg(salary) from employee);
    END; 
    //
    DELIMITER ;

MariaDB [sandbox]> select * from employee;
+------------+-----------+--------------+--------+
| employeeid | firstname | departmentid | salary |
+------------+-----------+--------------+--------+
|          1 | aaa       |            1 |  10000 |
|          2 | bbb       |            2 |  10000 |
|          3 | ccc       |            3 |  10000 |
+------------+-----------+--------------+--------+
3 rows in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]>     select f(.05);
+----------+
| f(.05)   |
+----------+
| 11576.00 |
+----------+
1 row in set (0.00 sec)

MariaDB [sandbox]>
MariaDB [sandbox]>     select * from employee;
+------------+-----------+--------------+--------+
| employeeid | firstname | departmentid | salary |
+------------+-----------+--------------+--------+
|          1 | aaa       |            1 |  11576 |
|          2 | bbb       |            2 |  11576 |
|          3 | ccc       |            3 |  11576 |
+------------+-----------+--------------+--------+
3 rows in set (0.00 sec)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM