Oracle12c für Entwickler Carsten.Czarski@oracle.com http://tinyurl.com/apexcommunity http://sql-plsql-de.blogspot.com http://oracle-text-de.blogspot.com http://plsqlexecoscomm.sourceforge.net http://plsqlmailclient.sourceforge.net Twitter: @cczarski
Oracle12c für Entwickler Die Datenbank einfach, schnell und effizient nutzen... SQL Pattern Matching PL/SQL in "WITH" Klausel Identity Columns 32k Varchar Rollen für PL/SQL Invisible Columns Oracle TEXT, XML und Spatial
Identity Columns Tabellen erstellen - viel weniger Code Bisher create table tab_kunden ( id number(10) primary key name varchar2(200) : ); create sequence seq_kunden start with 1 increment by 1; Oracle12c create table kunden_tab( id number(10) primary key generated always as identity start with 1 increment by 1, name varchar2(200) : ); create or replace trigger tr_pk_kunden before insert on tab_kunden for each row begin :new.id := seq_kunden.nextval; end;
SQL "Row Limit" Klausel Zwei Beispiele... Sortiere nach "SAL" aufsteigend und gib die ersten 5 Zeilen zurück SELECT empno, ename, sal FROM ( emp ORDER SELECT BY sal empno, ASC ename, sal FROM emp ORDER BY sal DESC FETCH ) FIRST 5 ROWS ONLY; WHERE rownum <= 5; Sortiere nach "SAL" absteigend, überspringe 3 Zeilen und gib dann die nächsten drei Zeilen zurück SELECT empno, ename, sal FROM ( emp ORDER SELECT BY sal rownum DESC zeile, empno, ename, sal FROM ( OFFSET SELECT 3 ROWS empno, FETCH ename, FIRST 3 sal ROWS FROM ONLY; emp ORDER BY sal DESC ) ) WHERE zeile BETWEEN 4 AND 6;
VARCHAR-Spalten nun bis 32K Grenze damit analog zu PL/SQL Verwendung aller SQL-Funktionen möglich Einmaliger Setup der Datenbank erforderlich (mit dem DBA) create table TAB_KUNDEN ( id number generated as identity, first_name varchar2(30), last_name varchar2(30), first_order date, kommentare varchar2(32767) );
PL/SQL WITH Klausel PL/SQL Funktionen lokal für eine SQL-Abfrage Die Funktion existiert nur für diese SQL-Abfrage Keine Persistenz im Data Dictionary WITH FUNCTION get_domain(url VARCHAR2) RETURN VARCHAR2 IS pos BINARY_INTEGER; len BINARY_INTEGER; BEGIN pos := INSTR(url, 'www.'); len := INSTR(SUBSTR(url, pos + 4), '.') - 1; RETURN SUBSTR(url, pos + 4, len); END; SELECT DISTINCT get_domain(catalog_url) FROM orders;
Zugriff auf PL/SQL Objekte in Oracle12c Einem PL/SQL-Objekt können nun Rollen zugewiesen werden Erlaubt wesentlich bessere Rechte / Rollenkonzepte grant {role to function meine_funktion; ACCESSIBLE BY-Klausel verhindert direkten Aufruf eines Objektes Verhindern des direkten Aufrufs von "Helper Packages" create or replace package pkg_helper accessible by {other plsql object is : end pkg_helper;
Unsichtbare Spalten...... sind unsichtbar, oder...? SQL> alter table EMP modify (COMM invisible, HIREDATE invisible); SQL> desc EMP Name Null? Typ SQL> select ename, hiredate, sal, comm from emp; ----------------------------- -------- -------------------- EMPNO NOT NULL NUMBER(4) ENAME HIREDATE SAL COMM ENAME VARCHAR2(10) -------------------- ------------------- ---------- ---------- JOB VARCHAR2(9) SMITH 17.12.1980 00:00:00 800 MGR NUMBER(4) ALLEN 20.02.1981 00:00:00 1600 300 SAL NUMBER(7,2) WARD 22.02.1981 00:00:00 1250 500 DEPTNO NUMBER(2) JONES 02.04.1981 00:00:00 2975 SQL> select * from emp; EMPNO ENAME JOB MGR SAL DEPTNO ---------- -------------------- --------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 800 20 7499 ALLEN SALESMAN 7698 1600 30 7521 WARD SALESMAN 7698 1250 30 7566 JONES MANAGER 7839 2975 20
Valid Time Temporal Management der "Gültigkeit" einer Tabellenzeile in der Datenbank Zusätzliche Spalten für "Gültig Von" und "Gültig Bis" Abfrage "zu einem Zeitpunkt" gültiger Rows mit SQL Bei Änderungen werden Spalten "Gültig Von" und "Gültig Bis" geschrieben Abfragen erfassen nur "gültige" Zeilen
SQL Pattern Matching Muster finden: über Tabellenzeilen hinweg! Finde "Double Bottoms" im Kursverlauf einer Aktie Wann beginnt das Muster? Wann endet das Muster? Welcher Aktienkurs? Muster innerhalb einer Woche? Aktienkurs 1 9 13 19 Tage
SQL Pattern Matching Muster finden: über Tabellenzeilen hinweg! Finde "Double Bottoms" im Kursverlauf einer Aktie Wann beginnt das Muster? Wann endet das Muster? Welcher Aktienkurs? SELECT first_x, last_z FROM ticker MATCH_RECOGNIZE ( Muster innerhalb einer Woche? PARTITION BY name ORDER BY time MEASURES FIRST(x.time) AS first_x LAST(z.time) AS last_z ONE ROW PER MATCH PATTERN (X+ Y+ W+ Z+) DEFINE X AS (price < PREV(price)) Y AS (price > PREV(price)) W AS (price < PREV(price)) Z AS (price > PREV(price)) X Y W Z Aktienkurs FIRST_X LAST_Z 1 9 13 19 Tage
if (linenext == null) { SQL next = ""; Pattern Matching else { next = linenext.getquantity(); if (!q.isempty() && (prev.isempty() (eq(q, prev) && gt(q, next)))) { state = "S"; return state; Muster finden: über Tabellenzeilen hinweg! if (gt(q, prev) && gt(q, next)) { state = "T"; return state; if (lt(q, prev) && lt(q, next)) { state = "B"; return state; if (!q.isempty() && (next.isempty() (gt(q, prev) && eq(q, next)))) { state = "E"; return state; if (q.isempty() eq(q, prev)) { state = "F"; return state; return state; private boolean eq(string a, String b) { if (a.isempty() b.isempty()) { return false; return a.equals(b); private boolean gt(string a, String b) { if (a.isempty() b.isempty()) { return false; return Double.parseDouble(a) > Double.parseDouble(b); private boolean lt(string a, String b) { if (a.isempty() b.isempty()) { return false; return Double.parseDouble(a) < Double.parseDouble(b); SELECT first_x, last_z FROM ticker MATCH_RECOGNIZE ( PARTITION BY name ORDER BY time MEASURES FIRST(x.time) AS first_x, LAST(z.time) AS last_z ONE ROW PER MATCH PATTERN (X+ Y+ W+ Z+) DEFINE X AS (price < PREV(price)), Y AS (price > PREV(price)), W AS (price < PREV(price)), Z AS (price > PREV(price) AND z.time - FIRST(x.time) <= 7 )) public String getstate() { return this.state; BagFactory bagfactory = BagFactory.getInstance(); 250+ Codezeilen Java 12 Zeilen SQL @Override public Tuple exec(tuple input) throws IOException { long c = 0; String line = ""; String pbkey = ""; V0Line nextline; V0Line thisline; Der Datenbank sagen, was zu tun ist nicht, wie es zu tun ist. V0Line processline; V0Line evalline = null; V0Line prevline; boolean nomorevalues = false; String matchlist = ""; ArrayList<V0Line> linefifo = new ArrayList<V0Line>(); boolean finished = false; DataBag output = bagfactory.newdefaultbag(); if (input == null) { return null; if (input.size() == 0) { return null;
Auf den Ort kommt es an: Oracle Spatial Spatial Performance-Boost alter system set SPATIAL_VECTOR_ACCELERATION = true Neue Funktionen und Möglichkeiten Unterstützung für neue Geometrietypen: NURBS, Raster Algebra, Neue Routing Engine Neuerungen in Oracle Maps: HTML5 Maps
Dokumente und XML: Unstrukturierte Daten XML DB ist nun integraler Bestandteil der Datenbank Unterstützung der jüngsten Standards XQuery-Update, XQuery-Fulltext Performance-Optimierungen XDB Performance, Oracle TEXT Near Real Time Indexing Oracle TEXT im Detail Automatische Spracherkennung, Reguläre Ausdrücke für Stopwörter, Pattern Stopclass, NEAR und "Mild Not" Operator und mehr...
Werkzeuge und Umgebungen Application Express SQL Developer Java in der Datenbank 'Develop for High Availibility'
APEX und Oracle12c Installieren und sofort nutzen keine Entwicklung! APEX-Patchset 4.2.3 ist verfügbar Volle Unterstützung für Oracle Multitenant APEX in der Container-Datenbank APEX in der Pluggable Database Neue, interessante Packaged Applications Survey Builder (APEX 4.2.2) Data Reporter Opportunity Tracker
SQL Developer Release 3.2
Oracle12c und Java Java in der Datenbank Java6 oder Java7 (JVM wird "pluggable") Java Logging und JNDI Support JDBC und Oracle12c JDBC & UCP Support für JavaSE 7 und JDBC 4.1 Nutzung von Oracle Multitenant via Service Names PL/SQL Typen ("boolean") können nun von Java aus angesprochen werden
Datenbank-Failover für die Middleware Situation bis Oracle11g End User Application Servers Database Servers Fokus liegt auf der Datenbank-Session TAF fokussiert auf Client-Server FCF/Fan fokussiert auf Connection Pool Aber kein Handling des Session State Nicht committetes DML PL/SQL Package state Session Contexts Und mehr... Auch bei TAF: Der Session State Der Entwickler muss etwas tun geht... verloren
Datenbank-Failover für die Middleware Transaction Guard und Application Continuity Transaction Guard Protokoll und Programmier-API für Entwickler Entwickler kann feststellen, welche Statements durchliefen und welche nicht Entwickler kann gezielt nur die "nicht gelaufenen" Kommandos wiederholen Application Continuity Selbstständiges Wiederholen nicht gelaufener Kommandos Ziel: Möglichst transparentes Failover für den Entwickler
Informationen in deutscher Sprache Communities APEX Community DBA Community Linux und Virtualisierung Exadata Community Veranstaltungen http://tinyurl.com/odd12c
Nutzen Sie Ihre Datenbank voll aus...? Analytic SQL XML Verarbeitung Mobile Applications (APEX) Java in the Database Fuzzy Search Location Data Flashback Query Linguistische Funktionen Native Webservices Image Processing (MultiMedia) PL/SQL Volltextsuche Pipelined Functions
Graphic Section Divider
Carsten.Czarski@oracle.com http://tinyurl.com/apexcommunity http://sql-plsql-de.blogspot.com http://oracle-text-de.blogspot.com http://oracle-spatial.blogspot.com http://plsqlexecoscomm.sourceforge.net http://plsqlmailclient.sourceforge.net Twitter: @cczarski @oraclebudb