Permalänk
Medlem

Simpel SQL, skapa en funktion

Hej hopp,

Pysslar lite med SQL och har nu kommit till att skapa egna funktioner, uppgiften är att skapa en funktion som returnerar summan av beställda varor med artikel_id 7. Det finns en automatiserad rättning på uppgiften, men den har inte godkänt det jag kommit fram till hittills.

delimiter // create function BestalldaVaror_7() returns int begin return summa = select sum(mangd) as summa from bestalln where artikel_id = 7; end//

Det den säger är att det är fel, och frågar "Vad är din frågas deklaration?".
Har jag inte deklarerat frågan rätt?

Om man provkör endast frågan för sig så får man det önskade resultatet, så vad är fel?

Permalänk
Medlem

Jag prövade även utan return summa = ... då jag kom på att man kanske inte kan skapa nya variabler hur som helst...

return (select sum(mangd) from bestalln where artikel_id = 7);

Men inte heller det var rätt, tydligen.

Permalänk
Medlem

Har du testat att ange enbart själva frågan?

select sum(mangd) from bestalln where artikel_id = 7

Permalänk
Medlem

Ja, jag kör en test-databas i MySQL genom wamp där jag har testat frågan så det är inte den det är fel på.

Jag har läst runt lite och prövat flera olika lösningar, men de flesta skiljer sig bara på småsaker, så jag vet inte varför det inte godkänns.

Permalänk
Medlem
Skrivet av Swefa:

Ja, jag kör en test-databas i MySQL genom wamp där jag har testat frågan så det är inte den det är fel på.

Jag har läst runt lite och prövat flera olika lösningar, men de flesta skiljer sig bara på småsaker, så jag vet inte varför det inte godkänns.

Nej alltså, jag vet att frågan är korrekt, men jag undrade om du testat att enbart ange själva frågan i svaret. Eller jag kanske missuppfattat hur själva rättningen går till. Mitt förslag var att bara ange nedanstående som svar:

select sum(mangd) from bestalln where artikel_id = 7

Permalänk
Medlem
Skrivet av Marty78:

Nej alltså, jag vet att frågan är korrekt, men jag undrade om du testat att enbart ange själva frågan i svaret. Eller jag kanske missuppfattat hur själva rättningen går till. Mitt förslag var att bara ange nedanstående som svar:

select sum(mangd) from bestalln where artikel_id = 7

Rättningen går till som så att man klistrar in det svar man kommit fram, hela funktionen i detta fallet, i ett webbgränssnitt som sen ser om det ser rätt eller fel ut, om det är fel kan man få lite hjälp men som kanske inte alltid hjälper så mycket.

Anger man bara det där får man fel, och lite hjälp som säger hur man ska fortsätta.

Permalänk
Medlem

Testa:

create function BestalldaVaror_7() returns int begin return select sum(mangd) from bestalln where artikel_id = 7; end

Permalänk
Medlem

Det har jag testat redan, då får man reda på att man måste ha med delimiter //
och end//, och då blir det samma som i mitt första inlägg.

Permalänk
Medlem

Ingen som är lite inne på MySQL och som bara kan säga om det jag kommit fram till är fungerande kod eller inte?

Om det är kod som borde funka, kan jag ju i alla fall mejla in uppgiften och säga detta, och borde då få rätt för det.

En av de tutorials jag kollat igenom är denna: http://www.databasejournal.com/features/mysql/article.php/356...

Är det tillräckligt att göra så som jag gjort, eller bör man deklarera en variabel summa och sen slänga in resultatet från SQL-satsen i denna variabel som man sedan returnerar, som dom gjort i den guiden?

Permalänk
Medlem
Skrivet av Swefa:

Är det tillräckligt att göra så som jag gjort, eller bör man deklarera en variabel summa och sen slänga in resultatet från SQL-satsen i denna variabel som man sedan returnerar, som dom gjort i den guiden?

om det nu rättas automatiskt och det verkar som att du kan testa hur mycket du vill, varför inte testa?

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

om det nu rättas automatiskt och det verkar som att du kan testa hur mycket du vill, varför inte testa?

Jag har testat en hel rad olika lösningar, men inte fått rätt på nån av dem, dock vet jag inte om det beror på något syntaxfel eller om just den lösningen helt enkelt inte finns med i rättningen, men kanske är rätt i alla fall.

Det var därför jag undrade om huruvida det var korrekt eller inte, det är ju ingen komplicerad funktion direkt så det borde inte ta många sekunder för någon som är erfaren att se om det är rätt eller inte.

Permalänk
Medlem

Vilken version av MySQL kör du?

Läs detta:
http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Medlem

Vi har inte pratat om vilken version vi använder/ska använda, men det bör väl vara senaste, alternativt vanligaste...

Men den lokala MySQL servern jag kör genom wamp för att prova SQL-frågor är 5.5.8.

Jag kollade på det exemplet i den länken, och där hade dem gjort i princip samma som jag gjort, såg jag, fast med ett annat SQL-kommando såklart, alltså borde det jag skrivit fungera..?

CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50) DETERMINISTIC RETURN CONCAT('Hello, ',s,'!');

Skillnaden är att deras tar emot ett argument, men att min funktion inte gör det borde väl inte skapa några problem?

Permalänk
Medlem

och frågan är inte ställd på ett sådant sätt att du skall skapa en funktion som returnerar antal beställda varor med ett specifikt id, exempelvis 7?
(dvs FUNCTION (id INT) )

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

och frågan är inte ställd på ett sådant sätt att du skall skapa en funktion som returnerar antal beställda varor med ett specifikt id, exempelvis 7?
(dvs FUNCTION (id INT) )

Det är två delfrågor, den första som jag pratat om här, där ska man inte ta något inargument, där ska det alltid vara id = 7. Men på nästa delfråga, där ska man ta emot ett inargument där man skickar in vilket id man vill ha.

Men jag har inte fått någon av dem att fungera!

Permalänk
Medlem
Skrivet av Swefa:

Det är två delfrågor, den första som jag pratat om här, där ska man inte ta något inargument, där ska det alltid vara id = 7. Men på nästa delfråga, där ska man ta emot ett inargument där man skickar in vilket id man vill ha.

Men jag har inte fått någon av dem att fungera!

ok, tänkte bara kolla...

funkar detta tro?

delimiter // CREATE FUNCTION BestalldaVaror_7() RETURNS INT BEGIN DECLARE returnVal INT SELECT SUM(mangd) INTO returnVal FROM bestalln WHERE artikel_id = 7 RETURN returnVal END//

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

ok, tänkte bara kolla...

funkar detta tro?

delimiter // CREATE FUNCTION BestalldaVaror_7() RETURNS INT BEGIN DECLARE returnVal INT SELECT SUM(mangd) INTO returnVal FROM bestalln WHERE artikel_id = 7 RETURN returnVal END//

Den klagade endast på att variabelnamnet var fel, och när jag ändrade detta så stod det att den inte stött på denna lösning förut, så jag tar i alla fall och skickar in den så får vi se vad läraren säger.

Jag jämförde lite med hur dem har gjort i boken, och själv tycker jag ju att det ser ut som kod som borde fungera

Permalänk
Medlem

Jag provade följande kod på min databas (MySQL v 5.5.12)

DROP FUNCTION IF EXISTS getSum; DELIMITER // CREATE FUNCTION getSum() RETURNS INT BEGIN DECLARE mysum INT; SELECT SUM(score) FROM score INTO mysum; RETURN mysum; END// DELIMITER ;

Jag provkörde funktionen med:

mysql> SELECT getSum(); +----------+ | getSum() | +----------+ | 90 | +----------+ 1 row in set (0.01 sec)

Fungerar utmärkt med andra ord. Kanske kan hjälpa dig? Jag har inte kodat i MySQL på flera år nu.

Jag läste inte igenom tråden jättenoga för jag har egentligen inte ens tid att svara just nu, men det där med "automatisk rättning" lät skumt. Hur vet du att det är den det inte är fel på? Varför använder du ens "automatisk rättning"?