Cursor Verständnis Probleme

mxm_d1

Benutzer
Beiträge
10
Hallo ich veruche momentan einen Cursor aus dem Internet umzusetzen


Ein beispiel bei dem ein Gehalt aktualisiert wird, ich möchte das als stored procedure erstellen

SELECT * FROM uebung.employees;

Insert Into Employees Values ( NULL , 'John', 35000, NULL),
( NULL , 'Jil', 50000, NULL ),
( NULL, 'Jacob', 40000, NULL),
( NULL, 'JMatt', 55000, NULL),
(NULL , 'Carla', 60000,NULL );

DELIMITER //
CREATE PROCEDURE p1()
DECLARE sal float;
DECLARE newsal float;
DECLARE Emp_Cur CURSOR FOR SELECT Salary, Updated_Salary FROM Employees;
OPEN Emp_Cur
FETCH NEXT FROM Emp_Cur INTO sal, newsal
WHILE @@FETCH_STATUS = 0
BEGIN
SET @newsal = @sal*1.25
UPDATE Employees SET Updated_Salary = newsal WHERE CURRENT OF Emp_Cur
FETCH NEXT FROM Emp_Cur INTO @sal, newsal
END
CLOSE Emp_Cur
DEALLOCATE Emp_Cur
DELIMITER ;


Kann mir jemand weiter helfen ? warum funktioniert das nicht.
bin beim Thema Cursos etwas ahnungslos
 
Werbung:
Welche Fehlermeldung kommt denn?

Warum verwendest du Variablen mal mit mal ohne @? Bei MSSQL müssten die immer ein @ vorweg haben, bei dir ist das mal so mal so. In einer Zeile sogar einmal mit und einmal ohne.
 
Welche Fehlermeldung kommt denn?

Warum verwendest du Variablen mal mit mal ohne @? Bei MSSQL müssten die immer ein @ vorweg haben, bei dir ist das mal so mal so. In einer Zeile sogar einmal mit und einmal ohne.
bekomme keine fehlermeldung was ich komisch finde, habe anfangs das beispiel aus dem internet so kopiert was nicht gepasst hat, dann habe ich etwas rum probiert :)
 
warum eigentlich nicht einfach ein kurzes und knackiges

update Employees set Updated_Salary = Salary * 1.25;

und gut is? Dann arbeitet intern auch ein CURSOR ;-)
 
Also dein Beispiel ist für "SQL", siehst stark nach MSSQL aus. Welches DBMS hast du denn? MySQL oder MariaDB sind nicht das selbe, ob sich das 1:1 übertragen lässt kann ich nicht sagen.

In dem verlinkten Beispiel sind außerdem Variablen alle sauber mit @ benannt. Bei dir fehlen fünf.

Das ein Cursor wenig sinnvoll ist sieht man hier sofort :-)
 
Vielleicht dürft ihr ja auch PostgreSQL verwenden ...

Code:
test=# select * from employees ;
 id | name  | salary | updated_salara 
----+-------+--------+----------------
  1 | John  |  35000 |               
  2 | Jil   |  50090 |               
  3 | Jacob |  40110 |               
(3 rows)

test=# create or replace function demo_cursor() returns text as $$ declare my_cursor scroll cursor for select * from employees order by id; my_rec record; begin for my_rec in my_cursor loop update employees set updated_salara=my_rec.salary*1.25 where current of my_cursor; end loop; return 'success'; end; $$language plpgsql; 
CREATE FUNCTION
test=# select * from demo_cursor();
 demo_cursor 
-------------
 success
(1 row)

test=# select * from employees ;
 id | name  | salary | updated_salara 
----+-------+--------+----------------
  1 | John  |  35000 |       43750.00
  2 | Jil   |  50090 |       62612.50
  3 | Jacob |  40110 |       50137.50
(3 rows)

test=#
 
muss leider schon mysql sein :)
also mein beispiel könnte man garnicht benutzen dafür ?
Vielleicht dürft ihr ja auch PostgreSQL verwenden ...

Code:
test=# select * from employees ;
 id | name  | salary | updated_salara
----+-------+--------+----------------
  1 | John  |  35000 |              
  2 | Jil   |  50090 |              
  3 | Jacob |  40110 |              
(3 rows)

test=# create or replace function demo_cursor() returns text as $$ declare my_cursor scroll cursor for select * from employees order by id; my_rec record; begin for my_rec in my_cursor loop update employees set updated_salara=my_rec.salary*1.25 where current of my_cursor; end loop; return 'success'; end; $$language plpgsql;
CREATE FUNCTION
test=# select * from demo_cursor();
 demo_cursor
-------------
 success
(1 row)

test=# select * from employees ;
 id | name  | salary | updated_salara
----+-------+--------+----------------
  1 | John  |  35000 |       43750.00
  2 | Jil   |  50090 |       62612.50
  3 | Jacob |  40110 |       50137.50
(3 rows)

test=#
 
Werbung:
Welche Fehlermeldung kommt denn?

Warum verwendest du Variablen mal mit mal ohne @? Bei MSSQL müssten die immer ein @ vorweg haben, bei dir ist das mal so mal so. In einer Zeile sogar einmal mit und einmal ohne.
Mal abgesehen davon das die Benutzung der Variablen in der SP falsch ist, gibt es 2 verschiedene Formen von Variablen in MySQL / MariaDB. Wenn eine Variable in eine SP deklariert wird muss man auch den Datentype angeben.
Diese Variable werden dann OHNE vorangestelltem @ genutzt.

Beispiel:

SQL:
DELIMITER //

CREATE procedure CalcValue ( OUT ending_value INT )
DETERMINISTIC

BEGIN

   DECLARE total_value INT;

   SET total_value = 50;

   label1: WHILE total_value <= 3000 DO
     SET total_value = total_value * 2;
   END WHILE label1;

   SET ending_value = total_value;

END; //
 
Zurück
Oben