Permalänk
Medlem

MySQL function

Hej!

Har stirrat mig gråhårig på detta. Är rätt ny då det gäller databaser och MySQL.

Jag har skapat en filmdatabas.
I denna DB har jag har jag bla en tabell "movie" i den finns filmer, varje film har attribut(kolumn) "runtime". Nu vill jag skapa en funktion (MySQL) som tar ut runtime från angiven film.

Med andra ord vill jag skapa en funktion som ersätter detta:
SELECT runtime
FROM movie
WHERE title = 'Skyfall'

Jag vill kunna:
SELECT functionsName('Skyfall') AS Runtime;

Och då få ut runtime för angiven film(i det här fallet Skyfall)

Är detta begripligt? Har trasslat och vänt upp och ner på saker men utan lycka och vänder mig därför hit i hopp om att någon kan hjälpa!

Tack!

Visa signatur

Chassi: Silverstone FT02 Moderkort: MSI X79A-GD65 8D CPU: i7-3930K CPU kylare: Corsair Hydro H80 RAM: Corsair Vengeance 4x4GB GPU: Gigabyte G1 GTX 980 SSD: ADATA Premier Pro SP900 256GB HDD: WD Green 3TB PSU: Corsair AX 1200W 80+ Gold

Permalänk
Medlem

I oracle så kan man göra liknande funktioner och det kallas för PL/SQL, vet inte hur det är i MySQL.

create or replace function get_film(
p_film in varchar2)
return varchar2
as
v_film varchar2(30);
begin
select runtime
into v_film
where title = p_film;
return p_film;
end;

Du anropar sedan funktionen med get_film('skyfall');

mvh

Visa signatur

i5 3570k 4,5Ghz, ASUS GeForce GTX 670 1200Mhz
Projekt M4INSTR3AM

Söker du en bra TS3 server? Besök då tråden: Chippi.se TS3 [Online 24/7]
Privata kanaler kan fixas i PM eller på TS.

Permalänk
Medlem
Skrivet av Tunnland:

Hej!

Har stirrat mig gråhårig på detta. Är rätt ny då det gäller databaser och MySQL.

Jag har skapat en filmdatabas.
I denna DB har jag har jag bla en tabell "movie" i den finns filmer, varje film har attribut(kolumn) "runtime". Nu vill jag skapa en funktion (MySQL) som tar ut runtime från angiven film.

Med andra ord vill jag skapa en funktion som ersätter detta:
SELECT runtime
FROM movie
WHERE title = 'Skyfall'

Jag vill kunna:
SELECT functionsName('Skyfall') AS Runtime;

Och då få ut runtime för angiven film(i det här fallet Skyfall)

Är detta begripligt? Har trasslat och vänt upp och ner på saker men utan lycka och vänder mig därför hit i hopp om att någon kan hjälpa!

Tack!

Innan du börjar skriva dessa metoder så bör du läsa på om funktioner och procedurer i mysql. Det är två olika användningsscenarion för dessa. Dessutom är det nästan regel än undantag att vanlig SQL är snabbare än funktioner och procedurer. Funktioner och procedurer måste ofta skrivas om en aning för att ta hänsyn till ny databasstruktur och förändrade krav på parametrar. En migration till en annan databas kan vara lite bökig men med stored procedures/functions blir det bara bökigare. Allt måste skrivas om.

Så, lite varningar men självklart får du hjälp också.

Det var ett tag sen jag skrev mysql-funktioner. Koden är inte testad.

CREATE FUNCTION getruntime(IN in_moviename VARCHAR(20)) RETURNS INT BEGIN DECLARE runtime_minutes INT; SELECT runtime INTO runtime_minutes FROM movies WHERE title = in_moviename; RETURN(runtime_minutes); END;

Används på detta vis:

SELECT getruntime('Skyfall');

Feedback är önskvärt.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Chipp!:

I oracle så kan man göra liknande funktioner och det kallas för PL/SQL, vet inte hur det är i MySQL.

create or replace function get_film(
p_film in varchar2)
return varchar2
as
v_film varchar2(30);
begin
select runtime
into v_film
where title = p_film;
return p_film;
end;

Du anropar sedan funktionen med get_film('skyfall');

mvh

Tack! Har inte haft möjlighet att prova med Oracle men var just med MySQL som krånglade.

Skrivet av Leedow:

Innan du börjar skriva dessa metoder så bör du läsa på om funktioner och procedurer i mysql. Det är två olika användningsscenarion för dessa. Dessutom är det nästan regel än undantag att vanlig SQL är snabbare än funktioner och procedurer. Funktioner och procedurer måste ofta skrivas om en aning för att ta hänsyn till ny databasstruktur och förändrade krav på parametrar. En migration till en annan databas kan vara lite bökig men med stored procedures/functions blir det bara bökigare. Allt måste skrivas om.

Så, lite varningar men självklart får du hjälp också.

Det var ett tag sen jag skrev mysql-funktioner. Koden är inte testad.

CREATE FUNCTION getruntime(IN in_moviename VARCHAR(20)) RETURNS INT BEGIN DECLARE runtime_minutes INT; SELECT runtime INTO runtime_minutes FROM movies WHERE title = in_moviename; RETURN(runtime_minutes); END;

Används på detta vis:

SELECT getruntime('Skyfall');

Feedback är önskvärt.

Tack så mycket! Jag provade att köra denna kod:

DELIMITER // CREATE FUNCTION getruntime(IN in_moviename VARCHAR(20)) RETURNS INT BEGIN DECLARE runtime_minutes INT; SELECT runtime INTO runtime_minutes FROM movies WHERE title = in_moviename; RETURN(runtime_minutes); END // DELIMITER ;

La till DELIMITER för att det skulle gå. Men får detta error meddelande:
"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN in_moviename VARCHAR(20)) RETURNS INT BEGIN DECLARE runtime_minutes INT;' at line 1"
(Sitter i phpmyadmin)

Visa signatur

Chassi: Silverstone FT02 Moderkort: MSI X79A-GD65 8D CPU: i7-3930K CPU kylare: Corsair Hydro H80 RAM: Corsair Vengeance 4x4GB GPU: Gigabyte G1 GTX 980 SSD: ADATA Premier Pro SP900 256GB HDD: WD Green 3TB PSU: Corsair AX 1200W 80+ Gold

Permalänk
Medlem
Skrivet av Tunnland:

La till DELIMITER för att det skulle gå. Men får detta error meddelande:
"#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IN in_moviename VARCHAR(20)) RETURNS INT BEGIN DECLARE runtime_minutes INT;' at line 1"
(Sitter i phpmyadmin)

Det är nog troligtvis "IN"-deklarationen av in_moviename som ska tas bort.

Alltså (IN in_moviename VARCHAR(20)) ska bli (in_moviename VARCHAR(20))

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Det är nog troligtvis "IN"-deklarationen av in_moviename som ska tas bort.

Alltså (IN in_moviename VARCHAR(20)) ska bli (in_moviename VARCHAR(20))

TUSEN TUSEN TACK!! Gud så skönt!! Funkar galant! Ska läsa på mig lite med om användinngsområdena när det gäller procedurer och funktioner men sååå glad att det funkar nu. Trasslade flera timmar med det igår utan lycka...

Tack igen!!

Visa signatur

Chassi: Silverstone FT02 Moderkort: MSI X79A-GD65 8D CPU: i7-3930K CPU kylare: Corsair Hydro H80 RAM: Corsair Vengeance 4x4GB GPU: Gigabyte G1 GTX 980 SSD: ADATA Premier Pro SP900 256GB HDD: WD Green 3TB PSU: Corsair AX 1200W 80+ Gold