<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>4coders &#187; MySQL</title>
	<atom:link href="http://4coders.info/category/programming/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://4coders.info</link>
	<description>It's not about coding, dude!</description>
	<lastBuildDate>Sat, 20 Nov 2010 11:30:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Jak dodać swoją funkcję w MySQL?</title>
		<link>http://4coders.info/jak-dodac-swoja-funkcje-w-mysql.html</link>
		<comments>http://4coders.info/jak-dodac-swoja-funkcje-w-mysql.html#comments</comments>
		<pubDate>Mon, 29 Dec 2008 21:35:38 +0000</pubDate>
		<dc:creator>coder</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[concat]]></category>
		<category><![CDATA[date_format]]></category>
		<category><![CDATA[definiowanie funkcji]]></category>
		<category><![CDATA[gpw]]></category>
		<category><![CDATA[log_bin_trust_function_creators]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[use]]></category>
		<category><![CDATA[własne funkcje w MySQL]]></category>

		<guid isPermaLink="false">http://4coders.info/?p=72</guid>
		<description><![CDATA[Dziś nauczymy się jak dodać swoją funkcję w MySQL. Temat będzie jedynie liźnięty i zobrazowany ładnym przykładem, który dziś miałem okazję popełnić przy okazji tego dziwnego tygodnia jakim jest ostatni tydzień roku. O tym później. Po co może nam się coś takiego przydać? Dla przykładu mamy kolumnę w tabeli, która jest datą (typ date), chcemy [...]]]></description>
			<content:encoded><![CDATA[<p>Dziś nauczymy się <strong>jak dodać swoją funkcję w MySQL</strong>. Temat będzie jedynie liźnięty i zobrazowany ładnym przykładem, który dziś miałem okazję popełnić przy okazji tego dziwnego tygodnia jakim jest ostatni tydzień roku. O tym później.</p>
<p>Po co może nam się coś takiego przydać?</p>
<p>Dla przykładu mamy kolumnę w tabeli, która jest datą (typ <em>date</em>), chcemy mieć funkcję, która dla tej daty zwróci nam poprawny numer tygodnia w roku oraz rok, zapiszmy to tak: <em>Y/v</em> (Y &#8211; rok, v -numer tygodnia).</p>
<p>Zwyczajowe podejście polegałoby na napisaniu takiego modyfikatora:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">date_format<span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">DATE</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;%Y/%v&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Co będzie działało popranie przez wszystkie dni tygodnia oprócz właśnie tego &#8222;magicznego&#8221; ostatniego tygodnia roku.</p>
<p>Do rozwiązania problemu przydadzą nam się właśnie nasze definiowane funkcje w MySQL. Napiszmy własną funkcję, która w przypadku gdy data jest grudniowa oraz tydzień wskazuje na pierwszy, odpowiednio zwiększa rok. Rzućmy okiem na kod zapisany w pliku <em>gpw.sql</em> ( GPW to nie <em>Giełda Papierów Wartościowych</em> ;-) ):</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SET</span> GLOBAL log_bin_trust_function_creators <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>;
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> GPW;
&nbsp;
DELIMITER <span style="color: #66cc66;">//</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span> GPW <span style="color: #66cc66;">&#40;</span>thedate <span style="color: #993333; font-weight: bold;">DATE</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">RETURNS</span> <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">20</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">BEGIN</span>
    <span style="color: #993333; font-weight: bold;">DECLARE</span> r <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">7</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #993333; font-weight: bold;">DECLARE</span> y <span style="color: #993333; font-weight: bold;">INT</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #993333; font-weight: bold;">DECLARE</span> v <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold;">IF</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>thedate<span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;%v&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'01'</span> <span style="color: #993333; font-weight: bold;">THEN</span>
        <span style="color: #993333; font-weight: bold;">IF</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>thedate<span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;%m&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'12'</span> <span style="color: #993333; font-weight: bold;">THEN</span>
            <span style="color: #993333; font-weight: bold;">SET</span> y <span style="color: #66cc66;">=</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>thedate<span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;%Y&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span>;
            <span style="color: #993333; font-weight: bold;">SET</span> v <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'01'</span>;
            <span style="color: #993333; font-weight: bold;">SET</span> r <span style="color: #66cc66;">=</span> CONCAT<span style="color: #66cc66;">&#40;</span>y<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'/'</span><span style="color: #66cc66;">,</span> v<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #993333; font-weight: bold;">ELSE</span>
            <span style="color: #993333; font-weight: bold;">SET</span> r <span style="color: #66cc66;">=</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>thedate<span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;%Y/%v&quot;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">IF</span>;
    <span style="color: #993333; font-weight: bold;">ELSE</span>
        <span style="color: #993333; font-weight: bold;">SET</span> r <span style="color: #66cc66;">=</span> DATE_FORMAT<span style="color: #66cc66;">&#40;</span>thedate<span style="color: #66cc66;">,</span><span style="color: #ff0000;">&quot;%Y/%v&quot;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">IF</span>;
&nbsp;
    <span style="color: #993333; font-weight: bold;">RETURN</span> r;
<span style="color: #993333; font-weight: bold;">END</span>
&nbsp;
<span style="color: #66cc66;">//</span>
&nbsp;
DELIMITER ;</pre></div></div>

<p>Szybko o tym co widzimy w kodzie:</p>
<ul>
<li>w pierwszym wierszu mówimy, aby <strong>MySQL</strong> nie burzył nam się gdy będziemy chcieli dodać swoją nową funkcję</li>
<li>drugi wiersz, usuwa nam funkcję GPW() jeśli taka już istnieje</li>
<li>potem mówimy aby separatorem wierszy od teraz były dwa znaki //</li>
<li>następnie ciało naszej funkcji, chyba proste?</li>
<li>potem, dwa ukośniki są istotne, kończą nam nasz długi &#8222;wiersz&#8221;</li>
<li>na końcu mówimy aby separatorem był znów średnik</li>
</ul>
<p>Mamy funkcję w pliku, celowo mówię o pliku, gdyż tak po prostu pisze się sprawniej nasze funkcję, otwieramy nasz <strong>MySQL</strong> klient:</p>
<pre>mysql -u root -h host -p</pre>
<p>W konsoli:</p>
<ul>
<li>przechodzimy do bazy w jakiej nasza funkcja będzie widoczna (polecenie <strong>use</strong>, np. <em>use temp</em>)</li>
<li>importujemy nasz plik z kodem funkcji poleceniem <strong>source</strong>, np. <em>source /home/temp/gpw.sql</em></li>
</ul>
<p>Od tej pory nasza funkcja GPW() powinna być widoczna w naszej bazie, tak długo, aż jej nie usuniemy. Możemy ją przetestować wpisując:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> GPW<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'2008-12-29'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Co odpowie nam poprawnym wynikiem w postaci ciągu:</p>
<pre>2009/01</pre>
<p>Nasze podejście pierwotne wysypałoby się odpowiadając <em>2008/01</em>.</p>
<p>To tyle na szybko o definiowanych funkcjach w MySQL.</p>
<h3  class="related_post_title">Zobacz inne ↓</h3><ul class="related_post"><li><a href="http://4coders.info/seksowne-przyciski-w-css.html" title="Seksowne przyciski w CSS">Seksowne przyciski w CSS</a> (0)</li><li><a href="http://4coders.info/programowanie-zurku-slaskiego.html" title="Programowanie żurku śląskiego">Programowanie żurku śląskiego</a> (0)</li><li><a href="http://4coders.info/jak-zablokowac-linkowanie-zdjec-z-naszej-domeny.html" title="Jak zablokować linkowanie zdjęć z naszej domeny?">Jak zablokować linkowanie zdjęć z naszej domeny?</a> (1)</li><li><a href="http://4coders.info/jak-stworzyc-sitemape-dla-robota-wyszukiwarki.html" title="Jak stworzyć sitemapę dla robota wyszukiwarki?">Jak stworzyć sitemapę dla robota wyszukiwarki?</a> (0)</li><li><a href="http://4coders.info/skrypciarze.html" title="Skrypciarze">Skrypciarze</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://4coders.info/jak-dodac-swoja-funkcje-w-mysql.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

