<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-x-formal">
	<id>https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thoefer</id>
	<title>GlossarWiki - Benutzerbeiträge [de-formal]</title>
	<link rel="self" type="application/atom+xml" href="https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thoefer"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Thoefer"/>
	<updated>2026-07-18T18:52:48Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=13060</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=13060"/>
		<updated>2009-07-16T15:21:56Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[JRuby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Paradigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer. Mehr noch: Sogar Klassen sind Klassenobjekte. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module können in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Metaprogrammierung, Codebeispiele=&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen übergebenen Block oder String im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
method_name = &amp;quot;bremsen&amp;quot;&lt;br /&gt;
Auto.class_eval &amp;lt;&amp;lt;-END&lt;br /&gt;
  def #{method_name}; &amp;quot;quieetsch.....&amp;quot;; end; &lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval mit übergebenem String&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meta-Programmierung: Die Hookmethode method_missing:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Bike &lt;br /&gt;
  def method_missing(name, *args)&lt;br /&gt;
    puts &amp;quot;die methode #{name} mit den parametern #{args.join(&amp;quot;, &amp;quot;)} existiert nicht.&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
b = Bike.new&lt;br /&gt;
puts b.rahmentypen &amp;quot;carbon&amp;quot;, &amp;quot;edelstahl&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
method_missing wird aufgerufen wenn eine Methode nicht existiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
* [http://home.vr-web.de/juergen.katins/ruby/buch/] Pickaxe-Buch auf deutsch&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
*http://tryruby.hobix.com/ #Try Ruby in your browser&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Ruby]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12921</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12921"/>
		<updated>2009-07-09T10:50:10Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[JRuby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Paradigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer. Mehr noch: Sogar Klassen sind Klassenobjekte. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module können in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Metaprogrammierung, Codebeispiele=&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen übergebenen Block oder String im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
method_name = &amp;quot;bremsen&amp;quot;&lt;br /&gt;
Auto.class_eval &amp;lt;&amp;lt;-END&lt;br /&gt;
  def #{method_name}; &amp;quot;quieetsch.....&amp;quot;; end; &lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval mit übergebenem String&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meta-Programmierung: Die Hookmethode method_missing:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Bike &lt;br /&gt;
  def method_missing(name, *args)&lt;br /&gt;
    puts &amp;quot;die methode #{name} mit den parametern #{args.join(&amp;quot;, &amp;quot;)} existiert nicht.&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
b = Bike.new&lt;br /&gt;
puts b.rahmentypen &amp;quot;carbon&amp;quot;, &amp;quot;edelstahl&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
method_missing wird aufgerufen wenn eine Methode nicht existiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
* [http://home.vr-web.de/juergen.katins/ruby/buch/] Pickaxe-Buch auf deutsch&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
*http://tryruby.hobix.com/ #Try Ruby in your browser&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12920</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12920"/>
		<updated>2009-07-09T10:48:58Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[JRuby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Paradigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer. Mehr noch: Sogar Klassen sind Klassenobjekte. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module können in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen übergebenen Block oder String im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
method_name = &amp;quot;bremsen&amp;quot;&lt;br /&gt;
Auto.class_eval &amp;lt;&amp;lt;-END&lt;br /&gt;
  def #{method_name}; &amp;quot;quieetsch.....&amp;quot;; end; &lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval mit übergebenem String&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meta-Programmierung: Die Hookmethode method_missing:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Bike &lt;br /&gt;
  def method_missing(name, *args)&lt;br /&gt;
    puts &amp;quot;die methode #{name} mit den parametern #{args.join(&amp;quot;, &amp;quot;)} existiert nicht.&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
b = Bike.new&lt;br /&gt;
puts b.rahmentypen &amp;quot;carbon&amp;quot;, &amp;quot;edelstahl&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
method_missing wird aufgerufen wenn eine Methode nicht existiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
* [http://home.vr-web.de/juergen.katins/ruby/buch/] Pickaxe-Buch auf deutsch&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
*http://tryruby.hobix.com/ #Try Ruby in your browser&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12918</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12918"/>
		<updated>2009-07-09T10:39:20Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[JRuby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Paradigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer. Mehr noch: Sogar Klassen sind Klassenobjekte. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module können in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen übergebenen Block oder String im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
method_name = &amp;quot;bremsen&amp;quot;&lt;br /&gt;
Auto.class_eval &amp;lt;&amp;lt;-END&lt;br /&gt;
  def #{method_name}; &amp;quot;quieetsch.....&amp;quot;; end; &lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval mit übergebenem String&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meta-Programmierung: Die Hookmethode method_missing:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Bike &lt;br /&gt;
  def method_missing(name, *args)&lt;br /&gt;
    puts &amp;quot;die methode #{name} mit den parametern #{args.join(&amp;quot;, &amp;quot;)} existiert nicht.&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
b = Bike.new&lt;br /&gt;
puts b.rahmentypen &amp;quot;carbon&amp;quot;, &amp;quot;edelstahl&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
method_missing wird aufgerufen wenn eine Methode nicht existiert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12917</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12917"/>
		<updated>2009-07-09T10:21:50Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[JRuby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Paradigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer. Mehr noch: Sogar Klassen sind Klassenobjekte. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module können in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen übergebenen Block oder String im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
method_name = &amp;quot;bremsen&amp;quot;&lt;br /&gt;
Auto.class_eval &amp;lt;&amp;lt;-END&lt;br /&gt;
  def #{method_name}; &amp;quot;quieetsch.....&amp;quot;; end; &lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval mit übergebenem String&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meta-Programmierung, send():&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12916</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12916"/>
		<updated>2009-07-09T10:09:56Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[JRuby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Prardigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer und sogar Klassen werden als Objekte behandelt. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module können in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen übergebenen Block oder String im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
Auto.class_eval &amp;lt;&amp;lt;-END&lt;br /&gt;
  def bremsen; &amp;quot;quieetsch.....&amp;quot;; end;&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval mit übergebenen String&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12915</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12915"/>
		<updated>2009-07-09T10:08:57Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[Ruby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Prardigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer und sogar Klassen werden als Objekte behandelt. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module können in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen übergebenen Block oder String im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
Auto.class_eval &amp;lt;&amp;lt;-END&lt;br /&gt;
  def bremsen; &amp;quot;quieetsch.....&amp;quot;; end;&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval mit übergebenen String&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12914</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12914"/>
		<updated>2009-07-09T10:03:42Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[Ruby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Prardigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer und sogar Klassen werden als Objekte behandelt. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Mixins: Module könne in Klassen &amp;quot;eingemischt&amp;quot; werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Die Klasse Auto wird geöffnet und die Methode gas_geben neu definiert&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
# Hier wird nur dem Objekt a eine Methode hinzugefügt&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung mit class_eval&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
# Ab sofort gibt es für Auto-Klassen auch eine bremsen-Methode&lt;br /&gt;
Auto.class_eval do&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; &amp;quot;quieeeetscch......&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
class_eval evaluiert einen String oder übergebenen Block im Klassenkontext. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12913</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12913"/>
		<updated>2009-07-09T09:44:19Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[Ruby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Prardigma: Alle Datentypen sind Objekte, auch primitive Datentypen wie Integer und sogar Klassen werden als Objekte behandelt. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Klassenerweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
puts a.gas_geben # =&amp;gt; &amp;quot;noch schneller gas geben&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung, Objekterweiterung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;gas geben&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
class Auto&lt;br /&gt;
  def gas_geben&lt;br /&gt;
    &amp;quot;noch schneller gas geben&amp;quot; &lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
a = Auto.new&lt;br /&gt;
&lt;br /&gt;
class &amp;lt;&amp;lt; a&lt;br /&gt;
  def bremsen&lt;br /&gt;
    &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
puts a.bremsen # =&amp;gt; &amp;quot;bremsen...&amp;quot;&lt;br /&gt;
puts Auto.new.bremsen # =&amp;gt; noMethodError&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12912</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12912"/>
		<updated>2009-07-09T09:34:39Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[Ruby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Prardigma: Alle Datentypen sind Objekte! Auch primitive Datentypen wie Integer oder sogar Klassen sind Objekte. &lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung: Klassen und Objekte können zur Laufzeit &amp;quot;geöffnet&amp;quot; und Methoden hinzugefügt oder verändert werden. &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12911</id>
		<title>Ruby (Programmiersprache)</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Ruby_(Programmiersprache)&amp;diff=12911"/>
		<updated>2009-07-09T09:33:53Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Definition =&lt;br /&gt;
Ruby ist eine objektorientierte Skriptsprache, die Syntaxelemente von Perl mit Features von Smalltalk kombiniert.&lt;br /&gt;
&lt;br /&gt;
=Geschichte=&lt;br /&gt;
Ruby wurde in Japan von Yukihiro &amp;quot;Matz&amp;quot; Matsumoto entwickelt und 1995 in der ersten Version veröffentlicht. &lt;br /&gt;
&lt;br /&gt;
=Interpreter=&lt;br /&gt;
Abgesehen vom Original-Interpreter MRI (Matz-Ruby-Interpreter) gibt es inzwischen Portierungen für Java ([[JRuby]]) oder .NET (IronRuby). Damit lassen sich mit Ruby alle Klassen und Bibliotheken der zugrunde liegenden Plattform verwenden. &lt;br /&gt;
&lt;br /&gt;
=Integration=&lt;br /&gt;
Die Integration von [[JRuby]] geht sogar so weit, dass sich mit [[Ruby on Rails]] JEE-konforme Webanwendungen entwickeln lassen, die man in einem JEE-Container deployen kann. Noch bessere Bytecode-Kompatibilität für Java bietet [[Groovy]]. &lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
* plattformübergreifend verwendbar&lt;br /&gt;
* strenges objektorientiertes Prardigma: Alle Datentypen sind Objekte (auch Primitive)&lt;br /&gt;
* Unterstüzung von regulären Ausdrücken auf Sprachebene&lt;br /&gt;
* Automatisches Garbage Collection&lt;br /&gt;
* Metaprogrammierung &lt;br /&gt;
* Packetmanager [[RubyGems]]&lt;br /&gt;
&lt;br /&gt;
= Ruby Shell =&lt;br /&gt;
Bei jeder Ruby-Installation ist eine Shell enthalten.&lt;br /&gt;
Die „irb“-Shell („Interactive Ruby“) kann verwendet werden, um schnell und einfach Ausdrücke zu testen.&lt;br /&gt;
&lt;br /&gt;
= Beispiele = &lt;br /&gt;
&lt;br /&gt;
Integer:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; n = 2 * 3 + 2&lt;br /&gt;
  =&amp;gt; 8&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; Fixnum&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
String:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt;n = &amp;quot;Hallo &amp;quot; * 3&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo Hallo Hallo&amp;quot;&lt;br /&gt;
  irb(main):002:0&amp;gt; n.class&lt;br /&gt;
  =&amp;gt; String&lt;br /&gt;
  irb(main):003:0&amp;gt; n[0,5]&lt;br /&gt;
  =&amp;gt; &amp;quot;Hallo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Schleifen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = 0&lt;br /&gt;
  =&amp;gt; 0&lt;br /&gt;
  irb(main):002:0&amp;gt; 1.upto(5) do |i| a = a + i end&lt;br /&gt;
  =&amp;gt; 1&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; 15&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Listen und Iterator:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
  irb(main):001:0&amp;gt; a = [ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot; ]&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;, &amp;quot;21&amp;quot;]&lt;br /&gt;
  irb(main):002:0&amp;gt; a.pop&lt;br /&gt;
  =&amp;gt; &amp;quot;21&amp;quot;&lt;br /&gt;
  irb(main):003:0&amp;gt; a&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
  irb(main):004:0&amp;gt; a.each do |c| puts c.class end&lt;br /&gt;
  String&lt;br /&gt;
  String&lt;br /&gt;
  Fixnum&lt;br /&gt;
  String&lt;br /&gt;
  =&amp;gt; [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, 2, &amp;quot;z&amp;quot;]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Metaprogrammierung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JRuby: Verwendung von Swing mit JRuby&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
require &amp;quot;java&amp;quot;&lt;br /&gt;
frame = javax.swing.JFrame.new()&lt;br /&gt;
frame.setSize 200, 200&lt;br /&gt;
frame.add javax.swing.JLabel.new(&amp;quot;hallo welt&amp;quot;)&lt;br /&gt;
frame.setVisible true&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;br /&gt;
*[http://www.ruby-lang.org/ Ruby-Website]&lt;br /&gt;
* Armin Roehrl und Stefan Schmiedl (2004): Big in Japan. Linux-Magazin Sonderheft Scripting Edition, Linux New Media AG&lt;br /&gt;
* [http://jruby.codehaus.org JRuby]&lt;br /&gt;
* [http://groovy.codehaus.org Groovy]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
*http://www.rubyenterpriseedition.com/&lt;br /&gt;
&lt;br /&gt;
{{{{SITENAME}}-konformer Artikel}}&lt;br /&gt;
{{Quellenangaben verbessern&lt;br /&gt;
| Formatierung        = true&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12900</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12900"/>
		<updated>2009-07-06T21:23:04Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Wiederverwendbarkeit:&amp;lt;/b&amp;gt; Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Wartbarkeit:&amp;lt;/b&amp;gt; Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Performance:&amp;lt;/b&amp;gt; Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;b&amp;gt;Sicherheit:&amp;lt;/b&amp;gt; Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen in PostgreSQL =&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch andere &amp;quot;Procedural Languages&amp;quot; wie PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen wie z.B. Schleifen zurückgreifen kann. &lt;br /&gt;
&lt;br /&gt;
Bevor man eine Funktion in einer &amp;quot;Procedural Language&amp;quot; schreiben kann, muss diese &amp;quot;installiert&amp;quot; werden. &lt;br /&gt;
&lt;br /&gt;
Dazu verwendet man z.B. für PL/pgSQL folgende Anweisung: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel einer rekursiven Funktion in PostgreSQL=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann &#039;&#039;&#039;die Größe eines Ordners rekursiv bestimmt&#039;&#039;&#039; werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang.html PostgreSQL Manual, Chapter 37, Procedural Languages]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang-install.html PostgreSQL Manual, Chapter 37, Installing Procedural Languages]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12893</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12893"/>
		<updated>2009-07-06T20:08:48Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen in PostgreSQL =&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch andere &amp;quot;Procedural Languages&amp;quot; wie PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen wie z.B. Schleifen zurückgreifen kann. &lt;br /&gt;
&lt;br /&gt;
Bevor man eine Funktion in einer &amp;quot;Procedural Language&amp;quot; schreiben kann, muss diese &amp;quot;installiert&amp;quot; werden. &lt;br /&gt;
&lt;br /&gt;
Dazu verwendet man z.B. für PL/pgSQL folgende Anweisung: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel einer rekursiven Funktion in PostgreSQL=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann &#039;&#039;&#039;die Größe eines Ordners rekursiv bestimmt&#039;&#039;&#039; werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang.html PostgreSQL Manual, Chapter 37, Procedural Languages]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang-install.html PostgreSQL Manual, Chapter 37, Installing Procedural Languages]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12892</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12892"/>
		<updated>2009-07-06T20:06:27Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen in PostgreSQL =&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch andere &amp;quot;Procedural Languages&amp;quot; wie PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen wie z.B. Schleifen zurückgreifen kann. &lt;br /&gt;
&lt;br /&gt;
Bevor man eine Funktion in einer &amp;quot;Procedural Language&amp;quot; schreiben kann, muss diese &amp;quot;installiert&amp;quot; werden. &lt;br /&gt;
&lt;br /&gt;
Dazu verwendet man z.B. für PL/pgSQL folgende Anweisung: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel in PostgreSQL=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang.html PostgreSQL Manual, Chapter 37, Procedural Languages]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang-install.html PostgreSQL Manual, Chapter 37, Installing Procedural Languages]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12891</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12891"/>
		<updated>2009-07-06T20:05:32Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen in PostgreSQL =&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch andere &amp;quot;Procedural Languages&amp;quot; wie PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen wie z.B. Schleifen zurückgreifen kann. &lt;br /&gt;
&lt;br /&gt;
Bevor man eine Funktion in einer &amp;quot;Procedural Language&amp;quot; schreiben kann, muss diese erst in jeder Datenbank, in der diese verwendet werden soll &amp;quot;installiert&amp;quot; werden. &lt;br /&gt;
&lt;br /&gt;
Dazu verwendet man z.B. für PL/pgsql folgende Anweisung: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel in PostgreSQL=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang.html PostgreSQL Manual, Chapter 37, Procedural Languages]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang-install.html PostgreSQL Manual, Chapter 37, Installing Procedural Languages]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12890</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12890"/>
		<updated>2009-07-06T20:04:31Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen in PostgreSQL =&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch andere &amp;quot;Procedural Languages&amp;quot; wie PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
Bevor man eine Funktion in einer &amp;quot;Procedural Language&amp;quot; schreiben kann muss man dieser erst in jeder Datenbank, in der diese verwendet werden soll &amp;quot;installiert&amp;quot; werden. &lt;br /&gt;
&lt;br /&gt;
Dazu verwendet man z.B. für PL/pgsql folgende Anweisung: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel in PostgreSQL=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang.html PostgreSQL Manual, Chapter 37, Procedural Languages]&lt;br /&gt;
* [http://www.postgresql.org/docs/8.3/static/xplang-install.html PostgreSQL Manual, Chapter 37, Installing Procedural Languages]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12889</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12889"/>
		<updated>2009-07-06T19:58:48Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen in PostgreSQL =&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel in PostgreSQL=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [[http://www.postgresql.org/docs/8.3/static/xplang.html]]&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12888</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12888"/>
		<updated>2009-07-06T19:58:29Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen in PostgreSQL =&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [[http://www.postgresql.org/docs/8.3/static/xplang.html]]&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12887</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12887"/>
		<updated>2009-07-06T19:57:21Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen=&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung aber als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [[http://www.postgresql.org/docs/8.3/static/xplang.html]]&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12886</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12886"/>
		<updated>2009-07-06T19:56:16Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Wiederverwendbarkeit: Eine Funktion kann von verschiedenen Clients genutzt werden. Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. &lt;br /&gt;
&lt;br /&gt;
* Wartbarkeit: Änderungen müssen nur zentral an einer Stelle durchgeführt werden. &lt;br /&gt;
&lt;br /&gt;
* Performance: Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn, da jegliche Kommunikation mit dem Clientprogramm während der Rekursion entfällt. Erst das Ergebnis wird dann wieder zum Clientprogramm geschickt. &lt;br /&gt;
&lt;br /&gt;
* Sicherheit: Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen=&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann - das heißt man legt letztendlich eine Baumstruktur in der Datenbank ab. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ (MediaFile oder MediaDirectory) von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit der Funktion &amp;quot;calc_mediadirectory_size&amp;quot; kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert, was in dieser Beispielanwendung als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [[http://www.postgresql.org/docs/8.3/static/xplang.html]]&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12885</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12885"/>
		<updated>2009-07-06T19:49:00Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die Datenbank geschickt werden. &lt;br /&gt;
&lt;br /&gt;
* Eine Funktion kann von verschiedenen Clients genutzt werden (Wiederverwendbarkeit). Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. Eine Änderung muss auch nur an einer Stelle durchgeführt werden (Wartbarkeit). &lt;br /&gt;
&lt;br /&gt;
* Vermeidung unnötiger Roundtrips zwischen Clientprogramm und Datenbank-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Sprachen=&lt;br /&gt;
In [[Postgresql]] können neben reinem [[SQL]] auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein [[Dateisystem]] in einer Datenbank modelliert werden, dh. eine Baumstruktur. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktion kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente [[NULL]] liefert - was in dieser Beispielanwendung als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
* [[http://www.postgresql.org/docs/8.3/static/xplang.html]]&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12884</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12884"/>
		<updated>2009-07-06T19:42:47Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
[[Stored Procedure]]s sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Absicherung gegen [[SQL Injection]], da die [[Stored Procedure]]s zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die DB geschickt werden. &lt;br /&gt;
&lt;br /&gt;
* Eine Funktion kann von verschiedenen Clients genutzt werden (Wiederverwendbarkeit). Die [[SQL]]-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. Eine Änderung muss auch nur an einer Stelle durchgeführt werden (Wartbarkeit). &lt;br /&gt;
&lt;br /&gt;
* Vermeidung unnötiger Roundtrips zwischen Clientprogramm und DB-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungssprachen=&lt;br /&gt;
In [[Postgresql]] können neben reinem SQL auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein Dateisystem in einer Datenbank abgelegt werden, dh. eine Baumstruktur. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktion kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente NULL liefert - was in dieser Beispielanwendung als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12883</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12883"/>
		<updated>2009-07-06T19:31:00Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
Stored Procedures sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Absicherung gegen [[SQL Injection]], da die Stored Procedures zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die DB geschickt werden. &lt;br /&gt;
&lt;br /&gt;
* Eine Funktion kann von verschiedenen Clients genutzt werden (Wiederverwendbarkeit). Die SQL-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. Eine Änderung muss auch nur an einer Stelle durchgeführt werden (Wartbarkeit). &lt;br /&gt;
&lt;br /&gt;
* Vermeidung unnötiger Roundtrips zwischen Clientprogramm und DB-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungssprachen=&lt;br /&gt;
In [[Postgresql]] können neben reinem SQL auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein Dateisystem in einer Datenbank abgelegt werden, dh. eine Baumstruktur. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktion kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente NULL liefert - was in dieser Beispielanwendung als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aufruf der Funktion:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12882</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12882"/>
		<updated>2009-07-06T19:29:49Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s (DBMS) möglich, komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit auszuführen. &lt;br /&gt;
&lt;br /&gt;
Stored Procedures sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Absicherung gegen [[SQL Injection]], da die Stored Procedures zusätzliche Befehle zur Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die DB geschickt werden. &lt;br /&gt;
&lt;br /&gt;
* Eine Funktion kann von verschiedenen Clients genutzt werden (Wiederverwendbarkeit). Die SQL-Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. Eine Änderung muss auch nur an einer Stelle durchgeführt werden (Wartbarkeit). &lt;br /&gt;
&lt;br /&gt;
* Vermeidung unnötiger Roundtrips zwischen Clientprogramm und DB-Server, da z.B. eine Rekursion vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender Performancegewinn. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungssprachen=&lt;br /&gt;
In [[Postgresql]] können neben reinem SQL auch andere Sprache für das Schreiben von SP´s genutzt werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein Dateisystem in einer Datenbank abgelegt werden, dh. eine Baumstruktur. Ein Knoten kann also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann. Ein Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt um welchen Typ von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktion kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente NULL liefert - was in dieser Beispielanwendung als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12881</id>
		<title>Stored Procedure</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Stored_Procedure&amp;diff=12881"/>
		<updated>2009-07-06T19:25:15Z</updated>

		<summary type="html">&lt;p&gt;Thoefer: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definition=&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe von [[Stored Procedure]]s ist es dem Benutzer eines [[Datenbank-Management-System]]s &lt;br /&gt;
&lt;br /&gt;
(DBMS) möglich,&lt;br /&gt;
komplexe Folgen von [[SQL]]-Anweisungen im System unter einem Namen zu speichern und jederzeit &lt;br /&gt;
&lt;br /&gt;
auszuführen. &lt;br /&gt;
&lt;br /&gt;
Stored Procedures sind Funktionen, die innerhalb des DB-Server gespeichert werden und wie alle &lt;br /&gt;
&lt;br /&gt;
anderen, bereits eingebauten Funktionen z.B. round() aufgerufen werden können. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Vorteile=&lt;br /&gt;
&lt;br /&gt;
* Absicherung gegen [[SQL Injection]], da die Stored Procedures zusätzliche Befehle zur &lt;br /&gt;
&lt;br /&gt;
Ablaufsteuerung und Auswertung erfolgter Anweisungen enthalten können. Noch besser ist es aber SQL &lt;br /&gt;
&lt;br /&gt;
Injection bereits auf Anwendungs-Ebene vorzubeugen, also bevor die Abfragen an die DB geschickt &lt;br /&gt;
&lt;br /&gt;
werden. &lt;br /&gt;
&lt;br /&gt;
* Eine Funktion kann von verschiedenen Clients genutzt werden (Wiederverwendbarkeit). Die SQL-&lt;br /&gt;
&lt;br /&gt;
Anweisung verbirgt sich in der Funktion uns muss nicht jedesmal neu formuliert werden. Eine &lt;br /&gt;
&lt;br /&gt;
Änderung muss auch nur an einer Stelle durchgeführt werden (Wartbarkeit). &lt;br /&gt;
&lt;br /&gt;
* Vermeidung unnötiger Roundtrips zwischen Clientprogramm und DB-Server, da z.B. eine Rekursion &lt;br /&gt;
&lt;br /&gt;
vollständig in der SP formuliert werden kann. Dadurch ergibt sich unter Umständen ein gravierender &lt;br /&gt;
&lt;br /&gt;
Performancegewinn. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungssprachen=&lt;br /&gt;
In [[Postgresql]] können neben reinem SQL auch andere Sprache für das Schreiben von SP´s genutzt &lt;br /&gt;
&lt;br /&gt;
werden, z.B. in der Version 8.3: PL/pgSQL, eine PostgreSQL-eigene Sprache für das Schreiben von SP&lt;br /&gt;
&lt;br /&gt;
´s, aber auch PL/Tcl, PL/Python, PL/Perl oder C. &lt;br /&gt;
&lt;br /&gt;
Vorteil dieser Sprachen ist, dass man auf gewohnte Kontrollstrukturen zurückgreifen kann die es in &lt;br /&gt;
&lt;br /&gt;
reinem SQL nicht gibt z.B. Schleifen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Implementierungs-Beispiel=&lt;br /&gt;
Es soll ein Dateisystem in einer Datenbank abgelegt werden, dh. eine Baumstruktur. Ein Knoten kann &lt;br /&gt;
&lt;br /&gt;
also eine Datei oder ein Verzeichnis sein, welches wiederrum Kind-Elemente enthalten kann. Ein &lt;br /&gt;
&lt;br /&gt;
Problem in einer solchen Anwendung ist es, die Größe eines Ordners zu ermittteln. &lt;br /&gt;
&lt;br /&gt;
Im folgenden entspricht eine Datei einem MediaFile, ein Verzeichnis einem MediaDirectory. MediaFile &lt;br /&gt;
&lt;br /&gt;
und MediaDirectory sind beides MediaItems (Ist-Ein-Beziehung). Im Attribut parent_id ist der &lt;br /&gt;
&lt;br /&gt;
jeweilige Ordner referenziert in dem sich ein MediaItem befindet. Im Attribut type ist hinterlegt &lt;br /&gt;
&lt;br /&gt;
um welchen Typ von MediaItem es sich handelt. &lt;br /&gt;
&lt;br /&gt;
Vereinfachtes Datenbank-Schema:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE media_items&lt;br /&gt;
  (&lt;br /&gt;
   id            INTEGER       NOT NULL, &lt;br /&gt;
   parent_id     INTEGER, &lt;br /&gt;
   type          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   name          VARCHAR(80)   NOT NULL, &lt;br /&gt;
   size          INTEGER, &lt;br /&gt;
   content       BYTEA,&lt;br /&gt;
  );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mit dieser Funktion kann die Größe eines Ordners rekursiv bestimmt werden. Die Verwendung der &lt;br /&gt;
&lt;br /&gt;
coalesce-Funktion ist notwendig da ein MediaDirectory ohne Kind-Elemente NULL liefert - was in &lt;br /&gt;
&lt;br /&gt;
dieser Beispielanwendung als 0 interpretiert werden soll. &lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION calc_mediadirectory_size(integer) RETURNS numeric AS $$&lt;br /&gt;
  SELECT coalesce(sum(s), 0)&lt;br /&gt;
  FROM (&lt;br /&gt;
    SELECT&lt;br /&gt;
      CASE &lt;br /&gt;
        WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
          calc_mediadirectory_size(id)&lt;br /&gt;
        WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
          size&lt;br /&gt;
      END&lt;br /&gt;
    FROM media_items WHERE parent_id = $1&lt;br /&gt;
  ) sizetab(s)&lt;br /&gt;
$$ LANGUAGE SQL;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT&lt;br /&gt;
  CASE&lt;br /&gt;
    WHEN type = &#039;MediaDirectory&#039; THEN&lt;br /&gt;
      calc_mediadirectory_size(id)&lt;br /&gt;
    WHEN type = &#039;MediaFile&#039; THEN&lt;br /&gt;
      size&lt;br /&gt;
  END AS size, name&lt;br /&gt;
FROM&lt;br /&gt;
  media_items&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Quellen=&lt;br /&gt;
&lt;br /&gt;
* [[Ziegler (2007)]]&lt;br /&gt;
* [[Rütten, Glemser (2006)]]&lt;br /&gt;
&lt;br /&gt;
=Siehe auch=&lt;br /&gt;
&lt;br /&gt;
*[[Prepared Statement]]&amp;lt;br&amp;gt;&lt;br /&gt;
*[[SQL Injection]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Daten-Management]]&lt;br /&gt;
[[Kategorie:Sicherheit]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Thoefer</name></author>
	</entry>
</feed>