Oracle Developer Monthly Datenbank-Update für Anwendungsentwickler Februar 2016 Carsten Czarski Business Unit Database Oracle Deutschland B.V. & Co KG
http://tinyurl.com/modernappdev12c http://tinyurl.com/oracloudnow
http://tinyurl.com/modernappdev12c http://tinyurl.com/modernappdev
Wichtige Termine 10. März 15. März 15. März 16. März 17. März 20. April 26. April Mai 2016 Juni 2016 APEX Meetup in Hamburg mit Marc Sewtz Oracle Data Warehouse Konferenz 2016 in Mainz 2 Tage "APEX Startup" Hands-On Workshop bei der MT AG in Ratingen "APEX Startup" Hands-On Workshop bei Oracle in Dreieich APEX Meetup in München mit Marc Sewtz Oracle IT Transformation Summit München DOAG APEX Connect 2016 in Berlin DOAG 2016 Datenbank in Düsseldorf DOAG 2016 BI in Bonn
Digital Transformation IT Summit 20. April 2016 München http://digitaltransformationit.oracle.com/munich/de/
APEX Competition: Wer baut das coolste Dashboard? http://apexcompetition.org
APEX Competition: Wer baut das coolste Dashboard? Erstellt ein "Dashboard" mit APEX auf vorgegebenen Daten APEX-Diagramme, Open Source, D3.js, Reports und mehr Gewinner werden auf der APEX Connect 2016 in Berlin geehrt
Aktuelle Software Release und Patchstände Oracle Datenbank 12.1.0.2 SQL Developer 4.1.3 SQLcl 4.2.0.16 (18. Februar 2016) SQL Developer Data Modeler 4.1.3* node-oracledb 1.6* Application Express 5.0.3* Oracle Rest Data Services 3.0.3* Oracle NoSQL DB 12.1.3.5.2 * Bug Fix Release
Datumsverarbeitung in der Oracle-Datenbank Datentypen DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE Datumsformate NLS-Formatmasken, NLS-Datumssprache, Datums-Literale Datumsarithmetik Arbeiten mit Dezimalzahlen oder mit INTERVAL-Datentypen
Datumsverarbeitung Kodierung eines DATE SQL> select sysdate, dump(sysdate) dmp from dual; SYSDATE DMP --------------------------- ---------------------------------------- 22.02.2016 09:50:36 Typ=13 Len=8: 224,7,2,22,9,50,36,0 1 rows selected. E0,07 Hex 07E0 2016
Datumsverarbeitung TIMESTAMP (ohne Zeitzone) SQL> select systimestamp, dump(systimestamp) dmp from dual SYSTIMESTAMP DMP ---------------------------------- -------------------------------------------------------------------- 22.02.16 09:54:35,389132000 Typ=188 Len=20: 224,7,2,22,8,54,35,0,224,174,49,23,0,0,3,0,0,0,0,0 1 rows selected. TIMESTAMP WITH TIME ZONE SQL> select systimestamp, dump(systimestamp) dmp from dual SYSTIMESTAMP DMP ---------------------------------- -------------------------------------------------------------------- 22.02.16 09:54:35,389132000 +01:00 Typ=188 Len=20: 224,7,2,22,8,54,35,0,224,174,49,23,1,0,5,0,0,0,0,0 1 rows selected.
Datumsformate Default Datumsformat richtet sich nach NLS-Session Einstellung SQL> select * from nls_session_parameters; PARAMETER VALUE ------------------------------ ------------------------------------ NLS_LANGUAGE GERMAN NLS_TERRITORY GERMANY NLS_CURRENCY Γé¼ NLS_ISO_CURRENCY GERMANY NLS_NUMERIC_CHARACTERS,. NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD.MM.YYYY NLS_DATE_LANGUAGE GERMAN NLS_SORT GERMAN NLS_TIME_FORMAT HH24:MI:SSXFF NLS_TIMESTAMP_FORMAT DD.MM.RR HH24:MI:SSXFF NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR NLS_TIMESTAMP_TZ_FORMAT DD.MM.RR HH24:MI:SSXFF TZR NLS_DUAL_CURRENCY Γé¼ NLS_COMP BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE
Default-Datumsformate sind abhängig von NLS Ohne Formatmaske zu arbeiten, ist gefährlich... SQL> select to_date('22.02.2016') from dual; TO_DATE('22.02.2016') --------------------------- 22.02.2016 00:00:00 1 rows selected. Andere Session, andere NLS-Settings...? SQL> select to_date('22.02.2016') from dual; select to_date('22.02.2016') from dual * FEHLER in Zeile 1: ORA-01843: Kein gültiger Monat
Besser: Explizite Formate verwenden Explizite Formatmaske SQL> select to_date('22.02.2016', 'DD.MM.YYYY') DAT from dual; DAT --------------------------- 22.02.2016 00:00:00 Aber... SQL> select to_date('22-mar-2016', 'DD-MON-YYYY') DAT from dual; select to_date('22-mar-2016', 'DD-MON-YYYY') DAT from dual * FEHLER in Zeile 1: ORA-01843: Kein gültiger Monat
Besser: Explizite Formate verwenden Explizite Formatmaske und Datumssprache... SQL> select to_date('22-mar-2016', 'DD-MON-YYYY', 'nls_date_language=''english''') DAT from dual; DAT --------------------------- 22.03.2016 00:00:00 NLS_DATE_LANGUAGE ist wichtig für... Vollständige und abgekürzte Monatsnamen Vollständige und abgekürzte Tagesnamen Erster Tag der Woche (bei uns: Montag, in USA: Sonntag)
NLS-Unabhängige Datums-Literale: Ja, die gibt es auch! DATE-Literal nur für ein Datum ohne Uhrzeit SQL> select DATE'2016-01-01' as DATE_INDEPENDENT_NLS from dual; DATE_INDEPENDENT_NLS --------------------------- 22.02.2016 00:00:00 TIMESTAMP-Literal SQL> select TIMESTAMP'2016-01-01 20:00:00.183 CET' as TS_INDEPENDENT_NLS from dual; TS_INDEPENDENT_NLS -------------------------------------- 01.01.16 20:00:00,183000000 CET
Datumsarithmetik Klassische Arbeit mit DATE: Addition von Dezimalzahlen SQL> select sysdate, sysdate + 1 nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 22.02.2016 11:04:29 23.02.2016 11:04:29 SQL> select sysdate, sysdate - 1/48 nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 22.02.2016 11:04:34 22.02.2016 10:34:34 Auch mit TIMESTAMP möglich; dann aber automatische Konvertierung nach DATE SQL> select sysdate, sysdate + 1/(24*60) nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 22.02.2016 11:04:57 22.02.2016 11:05:57
Datumsarithmetik Arbeit mit INTERVAL-Datentyp SQL> select sysdate, sysdate + INTERVAL '1' DAY nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 22.02.2016 11:04:29 23.02.2016 11:04:29 SQL> select sysdate, sysdate + INTERVAL '30' MINUTE nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 22.02.2016 11:04:34 22.02.2016 10:34:34 SQL> select sysdate, sysdate + INTERVAL '1' MINUTE nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 22.02.2016 11:04:57 22.02.2016 11:05:57
Datumsarithmetik mit INTERVAL-Datentypen Aufpassen mit dem MONTH-Interval am Ende eines Monats SQL> -- 28.01.2016 SQL> select sysdate, sysdate + INTERVAL '1' MONTH nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 28.01.2016 11:04:29 28.02.2016 11:04:29
Datumsarithmetik mit INTERVAL-Datentypen Aufpassen mit dem MONTH-Interval am Ende eines Monats SQL> -- 28.01.2016 SQL> select sysdate, sysdate + INTERVAL '1' MONTH nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 28.01.2016 11:04:29 28.02.2016 11:04:29 SQL> -- 30.01.2016 SQL> select sysdate, sysdate + INTERVAL '1' MONTH nxt_date from dual;
Datumsarithmetik mit INTERVAL-Datentypen Aufpassen mit dem MONTH-Interval am Ende eines Monats SQL> -- 28.01.2016 SQL> select sysdate, sysdate + INTERVAL '1' MONTH nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 28.01.2016 11:04:29 28.02.2016 11:04:29 SQL> -- 30.01.2016 SQL> select sysdate, sysdate + INTERVAL '1' MONTH nxt_date from dual; select sysdate, sysdate + INTERVAL '1' MONTH nxt_date from dual; * FEHLER in Zeile 1: ORA-01839: Datum für angegebenen Monat nicht gültig
Datumsarithmetik mit INTERVAL-Datentypen ADD_MONTHS-Funktion berücksichtigt die Monatslängen SQL> -- 28.01.2016 SQL> select sysdate, sysdate + INTERVAL '1' MONTH nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 28.01.2016 11:04:29 28.02.2016 11:04:29 SQL> -- 30.01.2016 SQL> select sysdate, add_months(sysdate, 1) nxt_date from dual; SYSDATE NXT_DATE ------------------- ------------------- 30.01.2016 11:04:29 29.02.2016 11:04:29
Datumsarithmetik: Subtraktion mit DATE Subtraktion mit DATE liefert Dezimalzahlen zurück. SQL> select DATE'2016-04-29' - DATE'2016-01-01' date_diff from dual; DATE_DIFF ---------------- 119 SQL> select to_date('2016-04-29 12:00', 'YYYY-MM-DD HH24:MI') to_date('2016-04-27 08:30', 'YYYY-MM-DD HH24:MI') date_diff from dual; DATE_DIFF ---------------- 2,14583333
Datumsarithmetik: Subtraktion mit DATE Dezimalzahlen lassen sich umrechnen... SQL> select numtodsinterval( to_date('2016-04-29 12:00', 'YYYY-MM-DD HH24:MI') to_date('2016-04-27 08:30', 'YYYY-MM-DD HH24:MI'),' 'DAY' ) date_diff from dual; DATE_DIFF ----------------------------- +000000002 03:30:00.000000000 Zwei Intervalldatentypen Interval Day to Second Interval Year to Month
Einige Hilfsfunktionen für DATE und TIMESTAMP -1- TRUNC: Schneidet Teile des Datums ab default: TRUNC 'DAY' TRUNC('2016-02-22 14:26', 'DAY') '2016-02-22 00:00' TRUNC('2016-02-22 14:26', 'HH') '2016-02-22 14:00' ROUND: Rundet ein Datum ROUND('2016-02-22 14:26', 'HH') '2016-02-22 14:00' ROUND('2016-02-22 14:36', 'HH') '2016-02-22 15:00' EXTRACT: Extrahiert Datumsteile EXTRACT(YEAR from DATE'2016-02-22') 2016 EXTRACT(MONTH from DATE'2016-02-22') 2
Einige Hilfsfunktionen für DATE und TIMESTAMP -2- NEXT_DAY: Gibt das Datum des nächsten geforderten Wochentags zurück Achtung: NLS_DATE_LANGUAGE ist hier wichtig! NEXT_DAY(DATE'2016-02-23', 'DIE') '2016-03-01' NEXT_DAY(DATE'2016-02-23', to_char(date'2001-01-02','day')) LAST_DAY: Gibt des Monatsultimo zurück LAST_DAY (DATE'2016-02-16') '2016-02-29' LAST_DAY (DATE'2016-01-16') '2016-01-31' Das ist ein Dienstag
PL/SQL Challenge schon gespielt? http://plsqlchallenge.oracle.com
Oracle Developer Monthly ab sofort on Demand http://tinyurl.com/oradevmonthly
Fragen und Diskussionen auf Twitter Nächster Oracle Developer Monthly Ausgabe 03/2016 erscheint Ende März 2016 Nächster Oracle Database Monthly 2. März 2016 14:00 Uhr #oradevmonthly http://tinyurl.com/oradevmonthly http://tinyurl.com/oradbamonthly