<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://robbie.databee.org/feed.xml" rel="self" type="application/atom+xml" /><link href="https://robbie.databee.org/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-08-17T02:05:30+00:00</updated><id>https://robbie.databee.org/feed.xml</id><title type="html">{“en”=&amp;gt;”Robert Marz, Databee - The IT-Architects”, “de”=&amp;gt;”Robert Marz, Databee - Die IT-Architekten”}</title><subtitle>{&quot;en&quot;=&gt;&quot;Robert Marz, Databee - The IT-Architects&quot;, &quot;de&quot;=&gt;&quot;Robert Marz, Databee - Die IT-Architekten&quot;}</subtitle><entry xml:lang="de"><title type="html">Portfolio-Site, OCI-Style</title><link href="https://robbie.databee.org/de/blog/portfolio-site-oci-style/" rel="alternate" type="text/html" title="Portfolio-Site, OCI-Style" /><published>2026-04-18T00:00:00+00:00</published><updated>2026-04-18T00:00:00+00:00</updated><id>https://robbie.databee.org/de/blog/portfolio-site-oci-style</id><content type="html" xml:base="https://robbie.databee.org/de/blog/portfolio-site-oci-style/"><![CDATA[<h1 id="portfolio-site-oci-style">Portfolio-Site, OCI-Style</h1>

<p>Meine Speaker-Seite lebt jetzt komplett in der Oracle Cloud. Kein
Webserver, kein VM, keine Nginx-Config, keine systemd-Units. Nur
Jekyll-Output in einem Object-Storage-Bucket und ein API Gateway
davor. Dieser Post beschreibt die Architektur, die Fallstricke und
warum es nicht der Weg ist, den ich zuerst eingeschlagen habe.</p>

<h2 id="ziel-bild">Ziel-Bild</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  Browser (robbie.databee.org)
            │ CNAME auf OCI-Gateway-Hostname
            ▼
  OCI API Gateway (public, eu-frankfurt-1)
       TLS-Terminierung, Path-Rewrites
            │
            ├─ /          → bucket/o/index.html
            ├─ /{path*}   → bucket/o/${path}
            └─ /files/*   → assets-bucket/o/${path}
            │
            ▼
  OCI Object Storage
      robbie-databee-org      (Website-HTML, 2500+ Objekte)
      robbie-talks-assets     (Slides, Demos, Video-Clips)
</code></pre></div></div>

<p>Zwei Buckets, ein Gateway, kein Compute. Betriebskosten für das
Traffic-Niveau einer Speaker-Seite: im Bereich von Cent pro Monat.</p>

<h2 id="warum-nicht-load-balancer">Warum nicht Load Balancer?</h2>

<p>Das war mein erster Reflex und der erste Sackgassen-Moment. OCI
Load Balancer kann Redirects und Path-Based-Routing auf verschiedene
Backend-Sets — aber <strong>kein transparentes URL-Rewriting</strong>. Für
Object-Storage-Hosting brauchst du genau das, weil die Web-URL
<code class="language-plaintext highlighter-rouge">/about/</code> auf den Bucket-Key <code class="language-plaintext highlighter-rouge">about/index.html</code> abgebildet werden
muss. Nicht als 3xx-Redirect an den Browser, sondern intern.</p>

<p>Oracles eigener Blog empfiehlt für Object-Storage-fronted Static
Sites <strong>API Gateway oder einen eigenen Webserver</strong>, nicht LB. Ich
habe den Reflex mit zwei Stunden VCN-Konfiguration bestraft, bevor
ich die Doku genauer gelesen habe. Lektion: auf das Werkzeug hören,
das die Plattform selbst für das Problem vorsieht.</p>

<h2 id="die-drei-url-formen">Die drei URL-Formen</h2>

<p>Damit <code class="language-plaintext highlighter-rouge">/foo</code>, <code class="language-plaintext highlighter-rouge">/foo/</code> und <code class="language-plaintext highlighter-rouge">/foo/index.html</code> alle funktionieren, ohne
dass API Gateway String-Manipulation im Request-Path macht (was es
nicht kann), lade ich jede Seite beim Deploy dreifach hoch: als
<code class="language-plaintext highlighter-rouge">foo/index.html</code> (kanonisch), als <code class="language-plaintext highlighter-rouge">foo/</code> (trailing-slash-Alias) und
als <code class="language-plaintext highlighter-rouge">foo</code> (bare-Alias). Alle drei Objekte zeigen auf dieselbe HTML-
Datei.</p>

<p>Storage ist billig genug, dass die Triple-Aufbewahrung nicht
schmerzt. Für 120 Talks + diverse Pages sind das ~2500 Objekte. Der
Deploy-Helper in Python macht das parallel über das OCI-SDK:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">iter_uploads</span><span class="p">(</span><span class="n">site_dir</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">root</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">files</span> <span class="ow">in</span> <span class="n">os</span><span class="p">.</span><span class="nf">walk</span><span class="p">(</span><span class="n">site_dir</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">files</span><span class="p">:</span>
            <span class="n">local</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="n">root</span><span class="p">)</span> <span class="o">/</span> <span class="n">name</span>
            <span class="n">rel</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="n">root</span><span class="p">).</span><span class="nf">relative_to</span><span class="p">(</span><span class="n">site_dir</span><span class="p">)</span> <span class="o">/</span> <span class="n">name</span>
            <span class="nf">yield </span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">local</span><span class="p">),</span> <span class="n">rel</span><span class="p">.</span><span class="nf">as_posix</span><span class="p">())</span>
            <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="sh">"</span><span class="s">index.html</span><span class="sh">"</span><span class="p">:</span>
                <span class="n">rel_dir</span> <span class="o">=</span> <span class="nc">Path</span><span class="p">(</span><span class="n">root</span><span class="p">).</span><span class="nf">relative_to</span><span class="p">(</span><span class="n">site_dir</span><span class="p">).</span><span class="nf">as_posix</span><span class="p">()</span>
                <span class="k">if</span> <span class="n">rel_dir</span> <span class="ow">and</span> <span class="n">rel_dir</span> <span class="o">!=</span> <span class="sh">"</span><span class="s">.</span><span class="sh">"</span><span class="p">:</span>
                    <span class="nf">yield </span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">local</span><span class="p">),</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">rel_dir</span><span class="si">}</span><span class="s">/</span><span class="sh">"</span><span class="p">)</span>
                    <span class="nf">yield </span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">local</span><span class="p">),</span> <span class="n">rel_dir</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="mime-typen-die-stille-falle">MIME-Typen: die stille Falle</h2>

<p><code class="language-plaintext highlighter-rouge">oci os object bulk-upload</code> ist schnell und bequem, aber es setzt
Content-Type nicht aus der Dateiendung. Alle Objekte bekommen
<code class="language-plaintext highlighter-rouge">application/octet-stream</code>. Browser interpretieren das als
“unbekannter Binärblob” und bieten Download statt Render. CSS lädt
nicht, JavaScript wird nicht ausgeführt, und Chrome zeigt dir einen
freundlichen Download-Dialog für eine Datei namens “Download”.</p>

<p>Lösung: im Deploy-Helper explizit <code class="language-plaintext highlighter-rouge">Content-Type</code> aus der Dateiendung
setzen. Python macht das mit einem kleinen Mapping <code class="language-plaintext highlighter-rouge">.css →
text/css</code>, <code class="language-plaintext highlighter-rouge">.js → text/javascript</code>, <code class="language-plaintext highlighter-rouge">.html → text/html; charset=utf-8</code>
— und Object Storage speichert das als Object-Metadata, das der
Gateway an den Client durchreicht.</p>

<h2 id="tls-die-zwei-resource-lösung">TLS: die Zwei-Resource-Lösung</h2>

<p>Self-signed Cert zum Starten, Let’s Encrypt sobald DNS zeigt. Weil
die DNS bei Strato liegt (kein OCI-DNS, also kein automatisches
ACME via OCI Certificate Service), läuft die Erst-Ausstellung mit
<code class="language-plaintext highlighter-rouge">certbot --manual --preferred-challenges dns</code> und einem einmaligen
TXT-Record beim Registrar.</p>

<p>Spannender Teil: wie das Cert in API Gateway reinkommt. Erste Runde
habe ich <code class="language-plaintext highlighter-rouge">oci api-gateway certificate create</code> benutzt — funktioniert,
aber das Service-Limit für API-Gateway-Certificates ist <strong>1</strong> pro
Region, und nach einem Delete ist der Zähler eventually-consistent.
Zehn Minuten Warten, dann ging Create erst wieder. Das ist kein
Fehler, sondern Design — und ein Problem, wenn du mal rotieren
willst ohne Downtime.</p>

<p>Der Ausweg: <strong>OCI Certificate Service</strong> (<code class="language-plaintext highlighter-rouge">certs-mgmt</code>) hat ein
anderes Quota, und der Gateway akzeptiert dessen OCIDs als
<code class="language-plaintext highlighter-rouge">certificate-id</code>. Zwei Resource-Typen, beide verwendbar, nur das
Certs-Mgmt-Quota ist weniger eng.</p>

<p>Dritte Lektion gratis: OCI API Gateway schickt das Intermediate-
Cert <strong>nicht automatisch mit</strong>, auch wenn du es beim
<code class="language-plaintext highlighter-rouge">create-by-importing-config</code> als <code class="language-plaintext highlighter-rouge">cert-chain-pem</code> übergibst. Der
Gateway braucht zusätzlich ein <strong>CA-Bundle</strong>, das du separat als
OCI-Certs-Mgmt-Resource anlegst und per <code class="language-plaintext highlighter-rouge">--ca-bundles</code> an den
Gateway hängst. Ohne das sagt Chrome zwar “Zertifikat gültig”, aber
trotzdem “Verbindung nicht sicher” — die Kette ist nicht komplett.</p>

<h2 id="content-management-für-vortrags-schrottlöcher">Content-Management für Vortrags-Schrottlöcher</h2>

<p>Die alte Seite hatte 62 Talks in einem verschachtelten Ordnerbaum
mit Leerzeichen und Umlauten in den Verzeichnis-Namen. Die neue
Struktur ist flach: <code class="language-plaintext highlighter-rouge">_talks/YYYY-MM-DD-slug.md</code>. Ein Python-Skript
hat die Migration gemacht — inklusive <code class="language-plaintext highlighter-rouge">redirect_from:</code> in jeder
Datei, damit die alten Post-Style-URLs (<code class="language-plaintext highlighter-rouge">/talks/2021/01/27/slug/</code>)
per <code class="language-plaintext highlighter-rouge">jekyll-redirect-from</code> 301 auf das neue Schema zeigen. SEO-
Juice bleibt erhalten.</p>

<p>Lücken-Schließung für 2021–2026: Oracle ACE bietet einen
HTML-Export seiner Contributions-Liste an. Ein weiteres Python-Script
parst den Export, dedupliziert nach Datum + normalisiertem Titel
gegen die bestehenden Markdown-Dateien, und schreibt neue Entries
für alles, was fehlt. 58 Vorträge auf einen Schlag nachgeholt, 25
falsch-erkannte Sprachen via Heuristik-Korrektur gefixt.</p>

<h2 id="upcoming-lifecycle">Upcoming-Lifecycle</h2>

<p>Jeder Vortrag hat ein <code class="language-plaintext highlighter-rouge">status</code>-Feld:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>proposed  → Abstract eingereicht
accepted  → Zusage da, Upcoming-Widget zeigt ihn
scheduled → Termin fix, Slides-Arbeit läuft
delivered → gehalten, Recording verlinkt
archived  → komplett dokumentiert
</code></pre></div></div>

<p>Die Landing-Page hat zwei Tiles: “Triff mich” zeigt die nächsten
<code class="language-plaintext highlighter-rouge">accepted</code>/<code class="language-plaintext highlighter-rouge">scheduled</code>-Talks, “Vergangene Vorträge” zeigt Zähler +
letzten Eintrag. Auf <code class="language-plaintext highlighter-rouge">/talks/</code> kommen die Upcoming oben, darunter
Jahres-Archiv. Ein <code class="language-plaintext highlighter-rouge">future: true</code> im <code class="language-plaintext highlighter-rouge">_config.yml</code> — sonst baut
Jekyll die Zukunfts-Talks gar nicht erst.</p>

<h2 id="analytics-ohne-google-analytics">Analytics ohne Google Analytics</h2>

<p>GA war der einzige Grund, einen Consent-Banner zu brauchen. OCI
API Gateway schreibt Access-Logs, und über Service Connector Hub
landen die in einem Object-Storage-Bucket. Mit GoAccess darüber
fällt ein HTML-Dashboard raus: Seitenaufrufe, Referrer, User-Agents,
Top-Pfade, 404s. Keine Cookies, kein JavaScript, kein Consent.
GA raus, Seite wieder DSGVO-sauber.</p>

<h2 id="was-das-setup-kostet">Was das Setup kostet</h2>

<ul>
  <li><strong>OCI Object Storage</strong>: Always-Free für 10 GB, wir sind bei
~500 MB (inkl. aller Slides-Uploads)</li>
  <li><strong>API Gateway</strong>: nicht Always-Free, aber für Traffic in dieser
Grössenordnung ~0,10–0,30 € / Monat</li>
  <li><strong>Compute</strong>: 0 €, läuft nichts</li>
  <li><strong>DNS</strong>: bei Strato sowieso schon bezahlt</li>
  <li><strong>Cert</strong>: Let’s Encrypt, 0 €</li>
</ul>

<p>Summa summarum: unter 50 Cent pro Monat. Und der Stack ist
vollständig in der OCI — für einen Oracle-Speaker ist das ein
hübscher “eat your own dogfood”-Punkt auf der Speaker-Page selbst.</p>

<h2 id="was-noch-offen-ist">Was noch offen ist</h2>

<ul>
  <li>Cert-Renewal vollautomatisch, ohne manuellen TXT-Record-Tanz</li>
  <li>CI/CD via GitLab (aktuell läuft der Deploy lokal)</li>
  <li>Log-Analytics-Pipeline vom Gateway bis zum Dashboard</li>
  <li>WebP + Lazy-Loading für die verbliebenen grossen Bilder</li>
  <li>Erweiterung über “nur Talks” hinaus: Workshops, Podcasts,
Publikationen als eigene Collections</li>
</ul>

<p>Den Deploy-Workflow dokumentiert ein dediziertes README im Repo.
Wer das Muster selber fahren will: das Template ist auf GitLab und
funktioniert mit wenig Anpassung für jede Jekyll-basierte
Speaker-Seite.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="blog" /><category term="2026" /><summary type="html"><![CDATA[Portfolio-Site, OCI-Style]]></summary></entry><entry xml:lang="de"><title type="html">DOAG 2020 Datenbank Online</title><link href="https://robbie.databee.org/videos/2020/09/28/DOAG-2020-Datenbank-Online-Datenbank-Deployments-mit-SQLcl-automatisieren/" rel="alternate" type="text/html" title="DOAG 2020 Datenbank Online" /><published>2020-09-28T00:00:00+00:00</published><updated>2020-09-28T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2020/09/28/DOAG%202020%20Datenbank%20Online%20-%20Datenbank-Deployments%20mit%20SQLcl%20automatisieren</id><content type="html" xml:base="https://robbie.databee.org/videos/2020/09/28/DOAG-2020-Datenbank-Online-Datenbank-Deployments-mit-SQLcl-automatisieren/"><![CDATA[<p>Robert Marz und Sabine Heimsath zeigen bei der DOAG 2020 Datenbank Online, wie SQLcl den DevOps-Alltag auf vielfältige Weise vereinfacht.</p>

<p>Die Session fand im Rahmen der kostenfreien Online-Vortragsreihe DOAG 2020 Datenbank Online statt: <a href="https://datenbank.doag.org/de/home/">https://datenbank.doag.org/de/home/</a></p>

<p>Vom 25. Mai bis 19. Juni 2020 gab es immer werktags zwei Remotevorträge als Ersatzprogramm zur ursprünglich in Düsseldorf geplanten Vor-Ort-Konferenz.</p>

<p>Aufgezeichnet am 2. Juni 2020</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Robert Marz und Sabine Heimsath zeigen bei der DOAG 2020 Datenbank Online, wie SQLcl den DevOps-Alltag auf vielfältige Weise vereinfacht.]]></summary></entry><entry xml:lang="de"><title type="html">APEX connect 2020 [online]</title><link href="https://robbie.databee.org/videos/2020/09/21/DOAG-APEX-connect-Polymorphic-Tablefunctions-and-Qualified-Expressions/" rel="alternate" type="text/html" title="APEX connect 2020 [online]" /><published>2020-09-21T00:00:00+00:00</published><updated>2020-09-21T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2020/09/21/DOAG%20APEX%20connect%20Polymorphic%20Tablefunctions%20and%20Qualified%20Expressions</id><content type="html" xml:base="https://robbie.databee.org/videos/2020/09/21/DOAG-APEX-connect-Polymorphic-Tablefunctions-and-Qualified-Expressions/"><![CDATA[<p>Robert Marz stellt die beiden seit Oracle 18c verfügbaren und für Entwickler sehr spannenden Features auf der APEX connect 2020 [Online] vor.</p>

<p>Mit Polymorphic Table Functions können Entwickler die Struktur der erzeugten Datensätze erst zur Laufzeit definieren. Qualified Expressions ermöglicht die Definition von Array- oder Record-Konstruktoren, die mehrere Werte mit einem einzelnen Befehl zuweisen. Dieses Feature ist – vor allem in Verbindung mit polymorphen Tabellenfunktionen – ein sehr mächtiges Werkzeug.</p>

<p>In meiner Session stelle ich die Konzepte der beiden Features vor und zeigt Anwendungsfälle sowie Szenarien aus der Praxis. Die Präsentation beinhaltet zudem eine detaillierte Live-Demo.</p>

<p>Die virtuelle und kostenfreie APEX connect 2020 [Online] fand am 5. und 6. Mai 2020 statt: Mehr Informationen: <a href="https://apex.doag.org/de/home/">https://apex.doag.org/de/home/</a></p>

<p>Aufgezeichnet am 5. Mai 2020</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Robert Marz stellt die beiden seit Oracle 18c verfügbaren und für Entwickler sehr spannenden Features auf der APEX connect 2020 [Online] vor.]]></summary></entry><entry xml:lang="en"><title type="html">ACEs @home, Episode 3</title><link href="https://robbie.databee.org/videos/2020/09/07/ACEs-@home-Episode-3/" rel="alternate" type="text/html" title="ACEs @home, Episode 3" /><published>2020-09-07T00:00:00+00:00</published><updated>2020-09-07T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2020/09/07/ACEs%20@home%20Episode%203</id><content type="html" xml:base="https://robbie.databee.org/videos/2020/09/07/ACEs-@home-Episode-3/"><![CDATA[<p>Speaker: Sabine Heimsath, Robert Marz</p>

<p>Title: Make yourself at home - in SQL Developer</p>

<p>Recorded on: Wednesday, June 17th 2020”</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Speaker: Sabine Heimsath, Robert Marz]]></summary></entry><entry xml:lang="de"><title type="html">DOAG TV Interview mit Thomas Neu</title><link href="https://robbie.databee.org/videos/2020/08/18/DOAG-TV-Interview-mit-Thomas-Nau/" rel="alternate" type="text/html" title="DOAG TV Interview mit Thomas Neu" /><published>2020-08-18T00:00:00+00:00</published><updated>2020-08-18T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2020/08/18/DOAG%20TV%20Interview%20mit%20Thomas%20Nau</id><content type="html" xml:base="https://robbie.databee.org/videos/2020/08/18/DOAG-TV-Interview-mit-Thomas-Nau/"><![CDATA[<p>Thomas Nau – Die Cloud-Infrastruktur der Universitäten in Baden-Württemberg</p>

<p>Was bewog die Hochschulen dazu, die eigene Lösung zu suchen?  Vor- und Nachteile des “gewählten Wagens” erfahren Sie im DOAG.tv-Interview mit Thomas Nau.</p>

<p>Der stellvertretender Leiter des Kommunikations- und Informationszentrums der Universität Ulm (kiz) sowie Leiter der Abteilung „Infrastruktur“ erzählt, wie die Cloud-Infrastruktur der Universitäten in Baden-Württemberg aussieht und was die Bildungseinrichtungen dazu bewog, die “eigene Lösung” zu realisieren.</p>

<p>Das Gespräch wurde im Rahmen der DOAG 2019 Konferenz + Ausstellung am 19. November 2019 in Nürnberg aufgezeichnet.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Thomas Nau – Die Cloud-Infrastruktur der Universitäten in Baden-Württemberg]]></summary></entry><entry xml:lang="en"><title type="html">LuxOUG Virtual Training Day Session Recording</title><link href="https://robbie.databee.org/videos/2020/07/02/LuxOUG-VTD-Session-Recording/" rel="alternate" type="text/html" title="LuxOUG Virtual Training Day Session Recording" /><published>2020-07-02T00:00:00+00:00</published><updated>2020-07-02T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2020/07/02/LuxOUG%20VTD%20Session%20Recording</id><content type="html" xml:base="https://robbie.databee.org/videos/2020/07/02/LuxOUG-VTD-Session-Recording/"><![CDATA[<p>Recording of my Session ‘Oracle Cloud Infrastructure – Network Setup for DBAs’ at Luxembourg Oracle Usergroup Virtual Training Days.</p>

<p>Unfortunately, my speaker camera didn’t made it into the zoom session…</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Recording of my Session ‘Oracle Cloud Infrastructure – Network Setup for DBAs’ at Luxembourg Oracle Usergroup Virtual Training Days. Unfortunately, my speaker camera didn’t made it into the zoom session…]]></summary></entry><entry xml:lang="de"><title type="html">Automatisierung und DevOps</title><link href="https://robbie.databee.org/services/2020/01/03/service-de-devops/" rel="alternate" type="text/html" title="Automatisierung und DevOps" /><published>2020-01-03T00:00:00+00:00</published><updated>2020-01-03T00:00:00+00:00</updated><id>https://robbie.databee.org/services/2020/01/03/service%20de%20devops</id><content type="html" xml:base="https://robbie.databee.org/services/2020/01/03/service-de-devops/"><![CDATA[<p>DevOps Tools sind meine Freunde.</p>

<p>Automatisierung ist mein Steckenpferd.</p>

<p>CI/CD Pipelines habe ich schon in vielen Spielarten aufgesetzt: In der Cloud. Und On-Premises.</p>

<p>Aber DevOps ist viel mehr als das - es  verändert die Art wie wir Zusammenarbeiten. Eine erfolgreiche Fusion der Entwicklung- und Betriebsabteilungen zu DevOps beinhaltet immer einen kulturellen Wandel.</p>

<p>Ich habe jahrelang auf beiden Seiten gearbeitet: Dev und Ops.
Profitieren Sie von meiner Erfahrung.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="services" /><summary type="html"><![CDATA[DevOps Tools sind meine Freunde.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://robbie.databee.org/images/services/devops-01.jpeg" /><media:content medium="image" url="https://robbie.databee.org/images/services/devops-01.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">Automation and DevOps</title><link href="https://robbie.databee.org/services/2020/01/03/service-en-devops.md/" rel="alternate" type="text/html" title="Automation and DevOps" /><published>2020-01-03T00:00:00+00:00</published><updated>2020-01-03T00:00:00+00:00</updated><id>https://robbie.databee.org/services/2020/01/03/service%20en%20devops.md</id><content type="html" xml:base="https://robbie.databee.org/services/2020/01/03/service-en-devops.md/"><![CDATA[<p>DevOps Tools are my friends.</p>

<p>Automation is my hobby.</p>

<p>I have implemented CI/CD pipelines in many different flavors:  In the Cloud. And on-premises.
But DevOps is much more than that - it changes the way we work together.  A successful merger of the development and operations departments to DevOps always involves a cultural change.</p>

<p>I have worked on both sides for years: Dev and Ops.
Benefit from my experience.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="services" /><summary type="html"><![CDATA[DevOps Tools are my friends.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://robbie.databee.org/images/services/devops-01.jpeg" /><media:content medium="image" url="https://robbie.databee.org/images/services/devops-01.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="de"><title type="html">Software Architektur</title><link href="https://robbie.databee.org/services/2020/01/02/de-architecture/" rel="alternate" type="text/html" title="Software Architektur" /><published>2020-01-02T00:00:00+00:00</published><updated>2020-01-02T00:00:00+00:00</updated><id>https://robbie.databee.org/services/2020/01/02/de%20architecture</id><content type="html" xml:base="https://robbie.databee.org/services/2020/01/02/de-architecture/"><![CDATA[<p>Ich bin der Überzeugung, dass ein gut designetes Datenmodell das Rückgrat einer jeden datengetriebenen Applikation ist. Bei meinen Projekten steht deshalb meist die Datenbank im Mittelpunkt.</p>

<p>Mein Verständnis von der Arbeit eines IT-Architects ist analog zur guten Arbeit eines richtigen Architekten: 
Es beginnt damit, dem Kunden zuzuhören und zu verstehen, was er wirklich will. Seine Entwürfe, Prototypen und MockUps entsprechen natürlich dem aktuellen Stand der Technik.</p>

<p>Ein IT-Architect beherrscht aber nicht nur Powerpoint und kann hübsche Diagramme zeichnen. Er bringt ein breites technisches Verständnis mit und kann ein Team durch den gesamten Entwicklungsprozess führen. Dabei achtet er darauf, dass alle in die gleiche Richtung laufen und coacht die einzelnen Teammitglieder, wo es sein muss. Vor allem ist er der technische Leiter und scheut nicht davor zurück, sich die Hände schmutzig zu machen.</p>

<p>Die Vorgehensweise - Agil, Wasserfall, V-Modell - hängt von den Projektzielen und den Wünschen des Kunden ab.</p>

<p>Ein guter IT-Architect arbeitet auf Augenhöhe mit dem fachlichen Projektleiter. Gemeinsam erreichen sie die Projektziele innerhalb der Zeit- und Budgetvorgaben.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="services" /><summary type="html"><![CDATA[Ich bin der Überzeugung, dass ein gut designetes Datenmodell das Rückgrat einer jeden datengetriebenen Applikation ist. Bei meinen Projekten steht deshalb meist die Datenbank im Mittelpunkt.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://robbie.databee.org/images/services/architecture-01.jpeg" /><media:content medium="image" url="https://robbie.databee.org/images/services/architecture-01.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">Software Architecture</title><link href="https://robbie.databee.org/services/2020/01/02/en-architecture/" rel="alternate" type="text/html" title="Software Architecture" /><published>2020-01-02T00:00:00+00:00</published><updated>2020-01-02T00:00:00+00:00</updated><id>https://robbie.databee.org/services/2020/01/02/en%20architecture</id><content type="html" xml:base="https://robbie.databee.org/services/2020/01/02/en-architecture/"><![CDATA[<p>I am convinced that a well-designed data model is the backbone of any data-driven application. That’s why my projects usually focus on the database.</p>

<p>My understanding of an IT architect’s work is similar to the excellent work of a real architect: 
It starts with listening to the customer and understanding what they want. The drafts, prototypes, and mock-ups he produces are state-of-the-art.</p>

<p>But an IT architect is not only proficient in PowerPoint and can also draw pretty diagrams. He has a broad technical understanding and can lead a team through the entire development process. He ensures that everyone is moving in the same direction and coaches the individual team members where necessary. Above all, he is the technical leader and does not shy away from getting his hands dirty.</p>

<p>The approach - agile, waterfall, V-model - depends on the project goals and the customer’s wishes.</p>

<p>A good IT architect works at eye level with the technical project manager. Together they achieve the project goals on time and in the budget.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="services" /><summary type="html"><![CDATA[I am convinced that a well-designed data model is the backbone of any data-driven application. That’s why my projects usually focus on the database.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://robbie.databee.org/images/services/architecture-01.jpeg" /><media:content medium="image" url="https://robbie.databee.org/images/services/architecture-01.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="de"><title type="html">Disaster Recovery</title><link href="https://robbie.databee.org/de/Dienstleistungen/devops_automatisierung.html" rel="alternate" type="text/html" title="Disaster Recovery" /><published>2020-01-01T00:00:00+00:00</published><updated>2020-01-01T00:00:00+00:00</updated><id>https://robbie.databee.org/de/Dienstleistungen/de%20disasterrecovery</id><content type="html" xml:base="https://robbie.databee.org/de/Dienstleistungen/devops_automatisierung.html"><![CDATA[<p>Ihre Oracle Datenbank ist korrupt. Und das Backup lässt sich nicht mehr einspielen?</p>

<p>Abseits der vom Hersteller unterstützten Wege gibt es versteckte Pfade - die meisten habe ich schon beschritten.</p>

<p>Ich habe schon viele hoffnungslose Datenbanken wiederbelebt oder zumindest die Daten gerettet.</p>

<p>Kontaktieren Sie mich. Einen Versuch ist es Wert.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="services" /><summary type="html"><![CDATA[Ihre Oracle Datenbank ist korrupt. Und das Backup lässt sich nicht mehr einspielen?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://robbie.databee.org/images/services/disaster-recovery-01.jpeg" /><media:content medium="image" url="https://robbie.databee.org/images/services/disaster-recovery-01.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">Disaster Recovery</title><link href="https://robbie.databee.org/services/2020/01/01/en-disasterrecovery/" rel="alternate" type="text/html" title="Disaster Recovery" /><published>2020-01-01T00:00:00+00:00</published><updated>2020-01-01T00:00:00+00:00</updated><id>https://robbie.databee.org/services/2020/01/01/en%20disasterrecovery</id><content type="html" xml:base="https://robbie.databee.org/services/2020/01/01/en-disasterrecovery/"><![CDATA[<p>Your Oracle database is corrupt. And the backup can not be restored?</p>

<p>There are hidden trails apart from those supported by the vendor - most of them I have already explored.</p>

<p>I have already revived many hopeless databases or at least saved the data.</p>

<p>Please contact me. It is worth a try.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="services" /><summary type="html"><![CDATA[Your Oracle database is corrupt. And the backup can not be restored?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://robbie.databee.org/images/services/disaster-recovery-01.jpeg" /><media:content medium="image" url="https://robbie.databee.org/images/services/disaster-recovery-01.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="en"><title type="html">Oracle Groundbreaker Interview</title><link href="https://robbie.databee.org/videos/2019/07/10/Oracle-Groundbreaker-Intervivw/" rel="alternate" type="text/html" title="Oracle Groundbreaker Interview" /><published>2019-07-10T00:00:00+00:00</published><updated>2019-07-10T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2019/07/10/Oracle%20Groundbreaker%20Intervivw</id><content type="html" xml:base="https://robbie.databee.org/videos/2019/07/10/Oracle-Groundbreaker-Intervivw/"><![CDATA[<p>Oracle ACE Robert Marz discusses the new challenges the Cloud poses for DBAs, and talks about Polymorphic Table Functions and Qualified Expressions, new features introduced in Oracle Database 18c.</p>

<p>Interview recorded at Kscope 2019 in Seattle, WA.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Oracle ACE Robert Marz discusses the new challenges the Cloud poses for DBAs, and talks about Polymorphic Table Functions and Qualified Expressions, new features introduced in Oracle Database 18c.]]></summary></entry><entry xml:lang="en"><title type="html">DOAG@Talk Interview mit Wim Coekaerts</title><link href="https://robbie.databee.org/videos/2018/11/07/DOAG@Talk-Interview-mit-Wim-Coekarts/" rel="alternate" type="text/html" title="DOAG@Talk Interview mit Wim Coekaerts" /><published>2018-11-07T00:00:00+00:00</published><updated>2018-11-07T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2018/11/07/DOAG@Talk%20Interview%20mit%20Wim%20Coekarts</id><content type="html" xml:base="https://robbie.databee.org/videos/2018/11/07/DOAG@Talk-Interview-mit-Wim-Coekarts/"><![CDATA[<p>Wim Coekaerts,  Senior Vice President of Operating Systems and Virtualization Engineering bei Oracle, versucht im DOAG.tv Interview mit Robert Marz, DOAG Themenverantwortlicher Cloud, die komplexe Frage zu klären, wie Linux die Cloud verändert.</p>

<p>Außerdem beurteilt er die Container-Plattformen Docker und Kubernetes und behandelt die Frage, welchen Sicherheits-Herausforderungen ein Kunde bei Wechsel von On-Premises zu Cloud-Lösungen ausgesetzt ist. Die größte Sorge sei hierbei das Gelangen von Informationen ins öffentliche Netzwerk.</p>

<p>Coekaerts sieht zudem immer noch einen großen Mangel an Management-Lösungen und sieht Entwicklungsbedarf von Diagnose-Tools für kritische Situationen.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Wim Coekaerts, Senior Vice President of Operating Systems and Virtualization Engineering bei Oracle, versucht im DOAG.tv Interview mit Robert Marz, DOAG Themenverantwortlicher Cloud, die komplexe Frage zu klären, wie Linux die Cloud verändert.]]></summary></entry><entry xml:lang="en"><title type="html">ODTUG CodeTalk Session 2018</title><link href="https://robbie.databee.org/videos/2018/05/17/ODTUG-CodeTalk-Session/" rel="alternate" type="text/html" title="ODTUG CodeTalk Session 2018" /><published>2018-05-17T00:00:00+00:00</published><updated>2018-05-17T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2018/05/17/ODTUG%20CodeTalk%20Session</id><content type="html" xml:base="https://robbie.databee.org/videos/2018/05/17/ODTUG-CodeTalk-Session/"><![CDATA[<p>This talk covers a real-world solution that recreates database links using ORDS, REST, and JSON. It breaks the limits of database links by loosely coupling two databases. The complexity is completely hidden from users and developers. Modern technologies such as REST and JSON offer elegant ways to couple databases without fixed dependencies. The protocol http(s) is able to surmount the corporate firewall and query databases in the cloud. A transparent layer made of table functions, views, and instead-of triggers can be placed over the connection.</p>

<p>This talk introduces REST, JSON, and ORDS very briefly. After the stage is set, we explore how to query auto-rest enabled tables from PL/SQL and process the JSON documents. Finally a view with an instead-of trigger is built that can be used by the application developers. A generator that produces all necessary objects will be shown. The generator can integrate into SQL Developer.</p>

<p>The presentation includes detaild live demos.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[This talk covers a real-world solution that recreates database links using ORDS, REST, and JSON. It breaks the limits of database links by loosely coupling two databases. The complexity is completely hidden from users and developers. Modern technologies such as REST and JSON offer elegant ways to couple databases without fixed dependencies. The protocol http(s) is able to surmount the corporate firewall and query databases in the cloud. A transparent layer made of table functions, views, and instead-of triggers can be placed over the connection.]]></summary></entry><entry xml:lang="en"><title type="html">ODTUG CodeTalk Session 2017</title><link href="https://robbie.databee.org/videos/2017/08/17/ODTUG-CodeTalk-Session/" rel="alternate" type="text/html" title="ODTUG CodeTalk Session 2017" /><published>2017-08-17T00:00:00+00:00</published><updated>2017-08-17T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2017/08/17/ODTUG%20CodeTalk%20Session</id><content type="html" xml:base="https://robbie.databee.org/videos/2017/08/17/ODTUG-CodeTalk-Session/"><![CDATA[<p>SQLcl is ready to replace the reliable but somewhat outdated SQL*Plus as the new command line interface of the database. 
The most exciting new feature of SQLcl is scripting: Batch scripts can now be written in languages such as JavaScript, Python, or Perl.</p>

<p>This means a veritable cornucopia of options, many of which are not obvious at first sight.</p>

<p>After a brief introduction to SQLcl, we will show many real-world examples that demonstrate the new possibilities.</p>

<p>All examples are available for download to allow for further tests and exploration.</p>

<p>This presentation provides many in-depth live demos.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[SQLcl is ready to replace the reliable but somewhat outdated SQL*Plus as the new command line interface of the database. The most exciting new feature of SQLcl is scripting: Batch scripts can now be written in languages such as JavaScript, Python, or Perl.]]></summary></entry><entry xml:lang="de"><title type="html">DOAG TV Interview mit Randolf Geist</title><link href="https://robbie.databee.org/videos/2016/12/14/DOAG-TV-Interview-mit-Randolf-Geist/" rel="alternate" type="text/html" title="DOAG TV Interview mit Randolf Geist" /><published>2016-12-14T00:00:00+00:00</published><updated>2016-12-14T00:00:00+00:00</updated><id>https://robbie.databee.org/videos/2016/12/14/DOAG%20TV%20Interview%20mit%20Randolf%20Geist</id><content type="html" xml:base="https://robbie.databee.org/videos/2016/12/14/DOAG-TV-Interview-mit-Randolf-Geist/"><![CDATA[<p>Randolf Geist, Experte für Oracle-Datenbanken, hat die Oracle Database Cloud ausführlich auf ihre Performance getestet.</p>

<p>Im Interview mit dem DOAG-Themenverantwortlichen Cloud, Robert Marz, spricht er über die Ergebnisse seiner mehrtägigen Testreihe:
Sowohl die CPU- als auch die Storage-Performance schnitten dabei gut ab. Die gemessenen Schwankungen der virtuellen Umgebung seien durchaus mit denen eines dedizierten Hosts vergleichbar, wenn auch die Spreizungen in der Cloud-Umgebung etwas größer ausfielen.</p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="videos" /><summary type="html"><![CDATA[Randolf Geist, Experte für Oracle-Datenbanken, hat die Oracle Database Cloud ausführlich auf ihre Performance getestet.]]></summary></entry><entry xml:lang="en"><title type="html">Characterset and Locale Settings for SQLcl</title><link href="https://robbie.databee.org/en/blog/sqlcl-charset/" rel="alternate" type="text/html" title="Characterset and Locale Settings for SQLcl" /><published>2016-09-02T00:00:00+00:00</published><updated>2016-09-02T00:00:00+00:00</updated><id>https://robbie.databee.org/en/blog/Zeichensatz%20und%20Spracheinstellungen%20bei%20SQLcl%20EN</id><content type="html" xml:base="https://robbie.databee.org/en/blog/sqlcl-charset/"><![CDATA[<h1 id="characterset-and-locale-settings-for-sqlcl">Characterset and Locale Settings for SQLcl</h1>

<p>Anyone who wants to produce or process data in different character sets or location, must be able to adapt its client environment dynamically.</p>

<h2 id="good-old-times-sqlplus--co">Good old times: sqlplus &amp; co</h2>
<p>In the world of Oracle tools this behavior is controlled by the environment variable $NLS_LANG:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">NLS_LANG</span><span class="o">=</span>GERMAN_GERMANY.WE8ISO8859P15
</code></pre></div></div>
<p>This causes Oracle tools to:</p>

<ul>
  <li>output all messages in German language</li>
  <li>adjust decimal, currency symbol, and so on accordingly</li>
  <li>and set the input and output character set to WE8ISO8859P15.</li>
</ul>

<p>This has been working for more than twenty years on both Windows and *nix environments:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">env</span>|grep NLS_LANG
<span class="nv">NLS_LANG</span><span class="o">=</span>GERMAN_GERMANY.utf8
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sqlplus rmarz/rmarz
SQL<span class="k">*</span>Plus: Release 12.1.0.2.0 Production on Mo Aug 29 19:59:11 2016
<span class="o">[</span>...]
SQL&gt; create table t_umlaut as <span class="k">select</span> <span class="s1">'Umlaut: ÄÖÜäöüß'</span> txt from dual<span class="p">;</span>

Table created.

SQL&gt; spool umlaut.utf-8.sqlplus.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">------------------------------------------------------------------</span>
Umlaut: ÄÖÜäöüß

SQL&gt; spool off
SQL&gt; <span class="nb">exit</span>
<span class="o">[</span>...]
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">export </span><span class="nv">NLS_LANG</span><span class="o">=</span>GERMAN_GERMANY.WE8ISO8859P15
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sqlplus rmarz/rmarz
SQL<span class="k">*</span>Plus: Release 12.1.0.2.0 Production on Mo Aug 29 20:07:08 2016
<span class="o">[</span>...]
SQL&gt; spool umlaut.8859-15.sqlplus.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">----------------------</span>
Umlaut: ▒▒▒▒▒▒▒

SQL&gt; spool off
<span class="o">[</span>...]

<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>file umlaut.<span class="k">*</span>
umlaut.8859-15.sqlplus.txt: ISO-8859 text
umlaut.utf-8.sqlplus.txt:   UTF-8 Unicode text

</code></pre></div></div>
<p>In the second case the umlauts are not displayed properly on the screen due to the terminal running under UTF-8.</p>

<p>The generated files have the expected encoding, as can be seen from the output of the “file”-command.
On Windows, this behavior is identical.</p>

<h2 id="modern-times-sqlcl">Modern Times: SQLcl</h2>

<p>In contrast, the modern SQLcl does not evaluate $NLS_LANG. The tool is written in Java and automatically uses the settings of the session it was started from.</p>

<p>On Linux and similar systems session settings can be  easily customized. They are controlled by the environment variable $LANG:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">unset </span>NLS_LANG
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">env</span>|grep LANG
<span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sql rmarz/rmarz
SQLcl: Release 4.2.0.16.153.2014 RC on Mon Aug 29 20:27:44 2016
<span class="o">[</span>...]
SQL&gt; spool umlaut.utf-8.sqlcl.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">----------------------</span>
Umlaut: ÄÖÜäöüß

SQL&gt; spool off
SQL&gt; <span class="nb">exit</span>

<span class="o">[</span>...]
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">export </span><span class="nv">LANG</span><span class="o">=</span>de_DE.iso885915@euro
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sql rmarz/rmarz
SQLcl: Release 4.2.0.16.153.2014 RC auf Mo Aug 29 20:40:27 2016
<span class="o">[</span>...]

SQL&gt; spool umlaut.8859-15.sqlcl.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">----------------------</span>
Umlaut: ÄÖÜäöüß

SQL&gt;
Abgemeldet von Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
<span class="o">[</span>...]
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>file umlaut.<span class="k">*</span>
umlaut.8859-15.sqlcl.txt:   ISO-8859 text
umlaut.8859-15.sqlplus.txt: ISO-8859 text
umlaut.utf-8.sqlcl.txt:     UTF-8 Unicode text
umlaut.utf-8.sqlplus.txt:   UTF-8 Unicode text
<span class="o">[</span>oracle@vbgeneric ~]<span class="err">$</span>
</code></pre></div></div>

<h2 id="and-what-about-windows">And what about Windows?</h2>

<p>On Windows, however, Java ignores the environment variable $LANG.
The configuration is read from the Windows system settings:
<a href="https://java.com/en/download/help/locale.xml">How do I view and change the system locale settings to use my language of choice?</a></p>

<p>Changing these settings affects all other applications on the machine as well.
Fortunately, Java evaluates additional variables. The variable $JAVA_TOOLS_OPTIONS come in handy:</p>

<pre><code class="language-ps1">PS C:\Users\rmarz&gt; sql.bat rmarz@192.168.56.100/orcl
SQLcl: Release 4.2.0.16.175.1027 RC auf Di Aug 30 03:45:21 2016
[...]

SQL&gt; spool umlaut.8859p15.sqlcl.win.txt
SQL&gt; select * from t_umlaut;

TXT
----------------------
Umlaut: ├ä├û├£├ñ├Â├╝├ƒ

SQL&gt; spool off
[...]

PS C:\Users\rmarz&gt;
PS C:\Users\rmarz&gt;
PS C:\Users\rmarz&gt; $env:JAVA_TOOL_OPTIONS='-Duser.language=en -Duser.region=US -Dfile.encoding=UTF-8'
PS C:\Users\rmarz&gt;
PS C:\Users\rmarz&gt; sql.bat rmarz/rmarz@192.168.56.100/orcl

Picked up JAVA_TOOL_OPTIONS: -Duser.language=en -Duser.region=US -Dfile.encoding=UTF-8

SQLcl: Release 4.2.0.16.175.1027 RC on Tue Aug 30 03:47:12 2016
[...]
SQL&gt; spool umlaut.utf-8.sqlcl.win.txt
SQL&gt; select * from t_umlaut;

TXT
----------------------
Umlaut: ├ä├û├£├ñ├Â├╝├ƒ

SQL&gt; spool off
SQL&gt; exit
[...]
PS C:\Users\rmarz&gt;

PS C:\Users\rmarz&gt; bash

rmarz@Tinkerbell MINGW64 ~
$ file umlaut.*
umlaut.8859p15.sqlcl.win.txt: ISO-8859 text, with CRLF line terminators
umlaut.utf-8.sqlcl.win.txt:   UTF-8 Unicode text, with CRLF line terminators

rmarz@Tinkerbell MINGW64 ~
</code></pre>
<p>The line “Picked up JAVA_TOOL_OPTIONS:” shows that this trick worked.
The screen output is incorrect, but the results in the spool files are fine.
We got Windows line endings - which is to be expected on Windows, of course.</p>

<p>There is no “file”-command in powershell. I used new bash for Windows 10 by Microsoft instead.</p>

<p>Further information on localization in Java can be found here:
<a href="http://www.oracle.com/technetwork/articles/javase/locale-140624.html">Internationalization: Understanding Locale in the Java Platform</a></p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="blog" /><category term="2016" /><summary type="html"><![CDATA[Characterset and Locale Settings for SQLcl]]></summary></entry><entry xml:lang="de"><title type="html">Zeichensatz und Spracheinstellungen bei SQLcl</title><link href="https://robbie.databee.org/de/blog/sqlcl-charset/" rel="alternate" type="text/html" title="Zeichensatz und Spracheinstellungen bei SQLcl" /><published>2016-09-02T00:00:00+00:00</published><updated>2016-09-02T00:00:00+00:00</updated><id>https://robbie.databee.org/de/blog/Zeichensatz%20und%20Spracheinstellungen%20bei%20sqlcl_DE</id><content type="html" xml:base="https://robbie.databee.org/de/blog/sqlcl-charset/"><![CDATA[<h1 id="zeichensatz-und-spracheinstellungen-bei-sqlcl">Zeichensatz und Spracheinstellungen bei SQLcl</h1>
<p>Wer Daten in unterschiedlichen Zeichensätzen oder Lokalisierung erzeugen oder verarbeiten will, muss seine Client-Umgebung flexibel anpassen können.</p>

<h2 id="die-gute-alte-zeit-sqlplus--co">Die gute alte Zeit: sqlplus &amp; co</h2>
<p>In der Oracle-Tool Welt passiert das über die Umgebungsvariable $NLS_LANG:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">NLS_LANG</span><span class="o">=</span>GERMAN_GERMANY.WE8ISO8859P15
</code></pre></div></div>
<p>veranlasst Oracle Tools dazu:</p>

<ul>
  <li>Meldungen in deutsch auszugeben</li>
  <li>Dezimaltrennzeichen, Währungssymbol, usw. entsprechend anzupassen</li>
  <li>und den Ein- und Ausgabezeichensatz auf WE8ISO8859P15 einzustellen.</li>
</ul>

<p>Das funktioniert schon seit mehr als zwanzig Jahren sowohl unter Windows als auch in *nix Umgebungen:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">env</span>|grep NLS_LANG
<span class="nv">NLS_LANG</span><span class="o">=</span>GERMAN_GERMANY.utf8
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sqlplus rmarz/rmarz
SQL<span class="k">*</span>Plus: Release 12.1.0.2.0 Production on Mo Aug 29 19:59:11 2016
<span class="o">[</span>...]
SQL&gt; create table t_umlaut as <span class="k">select</span> <span class="s1">'Umlaut: ÄÖÜäöüß'</span> txt from dual<span class="p">;</span>

Table created.

SQL&gt; spool umlaut.utf-8.sqlplus.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">------------------------------------------------------------------</span>
Umlaut: ÄÖÜäöüß

SQL&gt; spool off
SQL&gt; <span class="nb">exit</span>
<span class="o">[</span>...]
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">export </span><span class="nv">NLS_LANG</span><span class="o">=</span>GERMAN_GERMANY.WE8ISO8859P15
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sqlplus rmarz/rmarz
SQL<span class="k">*</span>Plus: Release 12.1.0.2.0 Production on Mo Aug 29 20:07:08 2016
<span class="o">[</span>...]
SQL&gt; spool umlaut.8859-15.sqlplus.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">----------------------</span>
Umlaut: ▒▒▒▒▒▒▒

SQL&gt; spool off
<span class="o">[</span>...]

<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>file umlaut.<span class="k">*</span>
umlaut.8859-15.sqlplus.txt: ISO-8859 text
umlaut.utf-8.sqlplus.txt:   UTF-8 Unicode text

</code></pre></div></div>
<p>Dass die Umlaute im zweiten Fall nicht richtig am Bildschirm ausgegeben werden, liegt daran, dass das Terminal selbst  unter UTF-8 läuft.</p>

<p>Die erzeugten Dateien haben das erwartete Encoding, wie die Ausgabe des “file”-Befehles zeigt.
Unter Windows ist das Verhalten identisch.</p>

<h2 id="moderne-zeiten-sqlcl">Moderne Zeiten: SQLcl</h2>

<p>Das moderne SQLcl hingegen wertet $NLS_LANG nicht aus. Das Werkzeug ist in Java geschrieben und übernimmt automatisch die Einstellung der Session aus der es gestartet wird.</p>

<p>In der Linux-Welt kann man diese einfach anpassen: sie wird durch die Umgebungsvariable $LANG gesteuert:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">unset </span>NLS_LANG
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">env</span>|grep LANG
<span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sql rmarz/rmarz
SQLcl: Release 4.2.0.16.153.2014 RC on Mon Aug 29 20:27:44 2016
<span class="o">[</span>...]
SQL&gt; spool umlaut.utf-8.SQLcl.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">----------------------</span>
Umlaut: ÄÖÜäöüß

SQL&gt; spool off
SQL&gt; <span class="nb">exit</span>

<span class="o">[</span>...]
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span><span class="nb">export </span><span class="nv">LANG</span><span class="o">=</span>de_DE.iso885915@euro
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>sql rmarz/rmarz
SQLcl: Release 4.2.0.16.153.2014 RC auf Mo Aug 29 20:40:27 2016
<span class="o">[</span>...]

SQL&gt; spool umlaut.8859-15.sqlcl.txt
SQL&gt; <span class="k">select</span> <span class="k">*</span> from t_umlaut<span class="p">;</span>

TXT
<span class="nt">----------------------</span>
Umlaut: ÄÖÜäöüß

SQL&gt;
Abgemeldet von Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
<span class="o">[</span>...]
<span class="o">[</span>oracle@vbgeneric ~]<span class="nv">$ </span>file umlaut.<span class="k">*</span>
umlaut.8859-15.sqlcl.txt:   ISO-8859 text
umlaut.8859-15.sqlplus.txt: ISO-8859 text
umlaut.utf-8.sqlcl.txt:     UTF-8 Unicode text
umlaut.utf-8.sqlplus.txt:   UTF-8 Unicode text
<span class="o">[</span>oracle@vbgeneric ~]<span class="err">$</span>
</code></pre></div></div>

<h2 id="und-was-ist-mit-windows">Und was ist mit Windows?</h2>

<p>Unter Windows wertet Java die  Umgebunsgvariable $LANG leider nicht aus.
Die Einstellungen werden aus den Windows-Systemeinstellungen gelesen:
<a href="https://java.com/en/download/help/locale.xml">How do I view and change the system locale settings to use my language of choice?</a></p>

<p>Änderungen an diesen Einstellungen gelten für alle Anwendungen.
Zum Glück wertet Java noch weitere Variablen aus. Wir machen uns die $JAVA_TOOLS_OPTIONS zu nutze:</p>

<pre><code class="language-ps1">PS C:\Users\rmarz&gt; sql.bat rmarz@192.168.56.100/orcl
SQLcl: Release 4.2.0.16.175.1027 RC auf Di Aug 30 03:45:21 2016
[...]

SQL&gt; spool umlaut.8859p15.sqlcl.win.txt
SQL&gt; select * from t_umlaut;

TXT
----------------------
Umlaut: ├ä├û├£├ñ├Â├╝├ƒ

SQL&gt; spool off
[...]

PS C:\Users\rmarz&gt;
PS C:\Users\rmarz&gt;
PS C:\Users\rmarz&gt; $env:JAVA_TOOL_OPTIONS='-Duser.language=en -Duser.region=US -Dfile.encoding=UTF-8'
PS C:\Users\rmarz&gt;
PS C:\Users\rmarz&gt; sql.bat rmarz/rmarz@192.168.56.100/orcl

Picked up JAVA_TOOL_OPTIONS: -Duser.language=en -Duser.region=US -Dfile.encoding=UTF-8

SQLcl: Release 4.2.0.16.175.1027 RC on Tue Aug 30 03:47:12 2016
[...]
SQL&gt; spool umlaut.utf-8.sqlcl.win.txt
SQL&gt; select * from t_umlaut;

TXT
----------------------
Umlaut: ├ä├û├£├ñ├Â├╝├ƒ

SQL&gt; spool off
SQL&gt; exit
[...]
PS C:\Users\rmarz&gt;

PS C:\Users\rmarz&gt; bash

rmarz@Tinkerbell MINGW64 ~
$ file umlaut.*
umlaut.8859p15.sqlcl.win.txt: ISO-8859 text, with CRLF line terminators
umlaut.utf-8.sqlcl.win.txt:   UTF-8 Unicode text, with CRLF line terminators

rmarz@Tinkerbell MINGW64 ~
</code></pre>
<p>Dass der Trick funktioniert hat, ist an der Zeile “Picked up JAVA_TOOL_OPTIONS:” zu erkennen.
Die Bildschirmausgabe ist nicht korrekt. Das Ergebnis in den Spool-Dateien hingegen schon.
Wir haben Windows-Zeilenabschlüsse erhalten - das ist unter Windows natürlich zu erwarten.</p>

<p>Um das “file”-Kommando auch in der powershell benutzen zu können, wurde hier die neue bash für Windows 10 von Microsoft eingesetzt.</p>

<p>Weiterführene Infos zur Lokalisierung von Java gibt es hier:
<a href="http://www.oracle.com/technetwork/articles/javase/locale-140624.html">Internationalization: Understanding Locale in the Java Platform</a></p>]]></content><author><name>{&quot;picture&quot;=&gt;&quot;/images/robbie.jpeg&quot;, &quot;twitter&quot;=&gt;&quot;RobbieDatabee&quot;}</name></author><category term="blog" /><category term="2016" /><summary type="html"><![CDATA[Zeichensatz und Spracheinstellungen bei SQLcl Wer Daten in unterschiedlichen Zeichensätzen oder Lokalisierung erzeugen oder verarbeiten will, muss seine Client-Umgebung flexibel anpassen können.]]></summary></entry></feed>