oracle 12.2 new features fÜr sql & pl/sql … · mit der version 12.2 erhalten wir die...
TRANSCRIPT
ROGER TROLLER, FINNOVA
ORACLE 12.2NEW FEATURES FÜR
SQL & PL/SQLENTWICKLER
DÜSSELDORF, 31.5.2017
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 1
➢ SQL & PL/SQL seit 1989
➢ 20 Jahre als Consultant
➢ 18 Jahre als Trainer für SQL & PL/SQL
➢ Gewinner Database Developer Choice Award PL/SQL
➢ Beta Tester ORACLE 12 Release 1
➢ Beta Tester ORACLE 12 Release 2
➢ Heute : Consultant Data Migration
➢ Blog: www.rogertroller.com
ROGER TROLLER
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 2
ABOUT
➢ Banking Software
➢ Eingesetzt bei 100 Banken in der Schweiz
➢ 4 Standorte
➢ 400 Mitarbeiter
➢ Standardsoftware basierend auf
➢ Java
➢ PL/SQL
➢ ORACLE 11.2
➢ Migration auf 12.2 geplant für 2018
FINNOVA
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 3
ABOUT
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data Conversion Erweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 4
AGENDA
ES HAT SICH EINIGESGETAN!
➢ 128 statt 30 Bytes möglich
➢ Keine lästigen Abkürzungen mehr um Dinge sinnvoll zu benennen
➢ Ermöglicht sprechende Namen für Datenbankobjekte
➢ Beispiele:
➢ Fremdschlüssel mit Von-Nach-Bezeichnung ohne dass man diese abkürzen muss
➢ Indexe mit Bezeichnung des Zweckes
➢ Constraints mit Umschreibung der Prüfung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 5
LANGE NAMEN FÜR ORACLE OBJEKTE
ENDLICH?
O12R2_LongNames1.sql
➢ Funktioniert damit unsere Applikation noch?
➢ Beispiel Logging?
➢ Dynamisches SQL?
➢ Hard-Coded Variablen Längen?
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 6
LANGE NAMEN FÜR ORACLE OBJEKTE
ABER
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 7
LANGE NAMEN FÜR ORACLE OBJEKTE
...
modul_name1 VARCHAR2(30);
modul_name2 VARCHAR2(61);
BEGIN
modul_name1 := $$PLSQL_UNIT;
modul_name2 := USER||'.'||$$PLSQL_UNIT;
...
WER KENNT DIES NICHT?
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 8
LANGE NAMEN FÜR ORACLE OBJEKTE
➢ Gleich ein weiteres neues Feature:
➢ Verwendung von statischen PL/SQL Ausdrücken, wo vorher nur Literale erlaubt waren
➢ ORA_MAX_NAME_LEN ist in DBMS_STANDARD definiert
...
modul_name1 all_objects.object_name%TYPE;
modul_name2 VARCHAR2((2*ORA_MAX_NAME_LEN) + 1);
BEGIN
modul_name1 := $$PLSQL_UNIT;
modul_name2 := USER||'.'||$$PLSQL_UNIT;
EINFACH ZULÖSEN
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 9
LANGE NAMEN FÜR ORACLE OBJEKTE
DBMS_SQL?
begin
print_table('SELECT COUNTRY_NAME FROM HR.COUNTRIES');
end;
/
COUNTRY_NAME : Argentina
-----------------
COUNTRY_NAME : Australia
-----------------
COUNTRY_NAME : ...
O12R2_LongNames2.sql
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 10
LANGE NAMEN FÜR ORACLE OBJEKTE
UND MIT LANGEN NAMEN?
begin
print_table('SELECT * FROM
CHILD_TABLE_WITH_REALLY_LONG_NAMES_TOO');
end;
/
Error report -
ORA-06502: PL/SQL: numeric or value error: character string
buffer too small
ORA-06512: at "SYS.DBMS_SQL", line 2084
ORA-06512: at "HR.PRINT_TABLE", line 11
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 11
LANGE NAMEN FÜR ORACLE OBJEKTE
DBMS_SQL ISTDAS PROBLEM
➢ DESC_TAB
➢ Implementiert einen Array mit einem Record (DESC_REC), in welchem der Name der Spalten auf 32 Byte beschränkt ist.
➢ DESC_TAB2 ist die Lösung
➢ Jedoch wird DESC_TAB2 durch eine andere Funktion abgefüllt, als die, welche wir in Vergangenheit verwendet haben
➢ DESCRIBE_COLUMNS2 statt DESCRIBE_COLUMNS
➢ Vorsicht!
➢ Der Zugewinn ist aus meiner Sicht kleiner als das Risiko, welches man eingeht. FAZIT:
VORSICHT!
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 12
LANGE NAMEN FÜR ORACLEOBJEKTE
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data Conversion Erweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 13
AGENDA
ES HAT SICH EINIGESGETAN!
Seit der Version 11.2 kennen wir die LISTAGG Funktion
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 14
LISTAGG ERWEITERUNGEN
SELECT d.department_name
,LISTAGG(e.last_name || ' ' || e.first_name,',')
WITHIN GROUP (ORDER BY e.last_name) AS employees
FROM departments d
JOIN employees e ON (e.department_id = d.department_id)
GROUP BY d.department_name;
ORA-01489: result of string concatenation is too long
O12R2_LISTAGG1.sql
WER KENNT DIES NICHT?
ORACLE 12.2 erweitert die LISTAGG Funktion um eine Überlaufbehandlung.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 15
LISTAGG ERWEITERUNGEN
PROAKTIVES FEHLERHANDLING
O12R2_LISTAGG1.sql
➢ ON OVERFLOW ERROR (Default)
➢ ON OVERFLOW TRUNCATE
➢ schneidet ganze Elemente weg und fügt die Anzahl abgeschnittener Elemente als Zähler hinzu
➢ ON OVERFLOW TRUNCATE WITHOUT COUNT
➢ schneidet ganze Elemente weg ohne Zähler
➢ ON OVERFLOW TRUNCATE 'truncation indicator' WITH
COUNT
➢ ermöglicht einen eigenen Indikator für den Überlauf
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 16
LISTAGG ERWEITERUNGEN
VIELE MÖGLICHKEITEN
O12R2_LISTAGG1.sql
➢ Schliesst eine Lücke beim erstellen von CSV-Strings
➢ Eliminiert eine Fehlerquelle, welche an vielen Orten (implizit) vorhanden ist.
➢ Löst die Problematik überlanger Strings nicht vollständig
➢ Eine eigene LISTAGG_CLOB Funktion ist eventuell weiterhin erforderlich
FAZIT:TOP!
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 17
LISTAGG ERWEITERUNGEN
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data ConversionErweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 18
AGENDA
ES HAT SICH EINIGESGETAN!
➢ Wer kennt dies nicht?
➢ Daten laden wobei ein Feld, welches „nur“ nummerische oder Datumsdaten enthält als VARCHAR2 definiert ist?
➢ Alle darin gespeicherten Werte „ganz sicher“ das gleiche Format aufweisen?
➢ Wer hat bisher keine solche (oder ähnliche) Funktion geschrieben?
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 19
DATA CONVERSION ERWEITERUNGEN
IMMER WIEDER…
CREATE OR REPLACE FUNCTION is_number (in_number IN VARCHAR2)
RETURN NUMBER
IS
BEGIN
…
ORACLE 12.2 kennt zwei Erweiterungen, welche uns die Konvertierung von Daten erleichtern.
➢ Neue Funktion VALIDATE_CONVERSION
➢ Prüfen ob Konversionen möglich sind (Funktionsresultat 0 oder 1)
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 20
DATA CONVERSION ERWEITERUNGEN
SEHR NÜTZLICH!
Beispiele (finden nicht nummerischer Werte):
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 21
DATA CONVERSION ERWEITERUNGEN
WITH data (str) AS (SELECT 'A3' FROM dual union all
SELECT '57.15' FROM dual union all
SELECT '-69.23' FROM dual)
SELECT str
, VALIDATE_CONVERSION(str AS NUMBER) AS conv
FROM data;
STR CONV
------ ----------
A3 0
57.15 1
-69.23 1
O12R2_DataConversion1.sql
DAMIT LÄSST SICHARBEITEN!
ORACLE 12.2 kennt zwei Erweiterungen, welche uns die Konvertierung von Daten erleichtern.
➢ Erweiterung der Syntax bei Konvertierungsfunktionen (TO_DATE, TO_NUMBER, CAST, etc.)
➢ Ersatzwert, falls Konversion fehl schlägt (NULL, DEFAULT)
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 22
DATA CONVERSION ERWEITERUNGEN
AUCH HIER: SEHR GUT
Beispiele (mehrstufige Datumskonvertierung):
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 23
DATA CONVERSION ERWEITERUNGEN
WITH data (str) AS (SELECT '15-03-2016' FROM dual UNION ALL
SELECT '2015.08.27' FROM dual UNION ALL
SELECT '15-MAR-99' FROM dual UNION ALL
SELECT '23. März 99' FROM dual UNION ALL
SELECT 'Test' FROM dual)
SELECT str, COALESCE(TO_DATE(str DEFAULT NULL ON CONVERSION ERROR,'DD-MON-RR')
,TO_DATE(str DEFAULT NULL ON CONVERSION ERROR,'DD. Month RR'
,'NLS_DATE_LANGUAGE=GERMAN')
,TO_DATE(str DEFAULT NULL ON CONVERSION ERROR,'DD.MM.YYYY')
,TO_DATE(str DEFAULT NULL ON CONVERSION ERROR,'YYYY.MM.DD'))
AS conversion
FROM data;
O12R2_DataConversion2.sql
Beispiele (mehrstufige Datumskonvertierung) Resultat:
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 24
DATA CONVERSION ERWEITERUNGEN
WIE FINDEN WIRDAS?
STR CONVERSION
----------- ----------
15-03-2016 15.03.2016
2015.08.27 27.08.2015
15-MAR-99 15.03.1999
23. März 99 23.03.1999
Test
➢ Wird uns sehr helfen, mit fehlerhaften Input-Daten umzugehen.
➢ Selbstgestrickte Lösungen sind nicht länger erforderlich.
FAZIT:TOP!
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 25
DATA CONVERSION ERWEITERUNGEN
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data Conversion Erweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 26
AGENDA
ES HAT SICH EINIGESGETAN!
Mit der Version 12.2 erhalten wir die Möglichkeit eigene Program Units als deprecated(veraltet/überholt) zu kennzeichnen.
Eigenschaften
➢ Beim Kompilieren der deprecated gekennzeichneten Program Unit erscheint eine Warnung
➢ Beim Kompilieren einer Program Unit, welche eine deprecated Program Unit verwendet erscheint die hinterlegte Warnung
➢ Die Warnungen lassen sich zu Fehler anheben.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 27
DEPRECATED PRAGMA
TÖNT GUT.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 28
DEPRECATED PRAGMA
ALTER SESSION SET PLSQL_WARNINGS = 'Enable:All'
/
CREATE OR REPLACE PROCEDURE p IS
PRAGMA deprecate(p,'p is deprecated please use p2 instead.');
BEGIN
sys.dbms_output.put_line('p');
END p;
/
Warning(2,4): PLW-06019: entity P is deprecated
O12R2_DeprecatedPragma1.sql
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 29
DEPRECATED PRAGMA
CREATE OR REPLACE PACKAGE pkg IS
PROCEDURE p;
PRAGMA deprecate(p
,'pkg.p is deprecated please use pkg.p2 instead.');
PROCEDURE p2;
END;
/
CREATE OR REPLACE PACKAGE BODY pkg IS
PROCEDURE p IS
BEGIN
sys.dbms_output.put_line('pkg.p');
END p;
...
O12R2_DeprecatedPragma2.sql
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 30
DEPRECATED PRAGMA
CREATE OR REPLACE PROCEDURE q IS
BEGIN
pkg.p();
sys.dbms_output.put_line('q');
END q;
/
Warning(3,4): PLW-06020: reference to a deprecated entity: P
declared in unit PKG[2,14]. pkg.p is deprecated please use
pkg.p2 instead.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 31
DEPRECATED PRAGMA
ALTER SESSION SET PLSQL_WARNINGS = 'ERROR:6020';
CREATE OR REPLACE PROCEDURE q IS
BEGIN
pkg.p();
sys.dbms_output.put_line('q');
END q;
/
Error(5,4): PLS-06020: reference to a deprecated entity: P
declared in unit PKG[2,14]. pkg.p is deprecated please use
pkg.p2 instead.
O12R2_DeprecatedPragma3.sql
ALLES GUT, ODER?
➢ Ich würde mir wünschen:
➢ Möglichkeit selektiv Deprecations auf Error zu stellen über:
➢ Unique Identifier
➢ Datumsparameter
➢ Zusätzlicher Parameter, welcher mit ERROR = TRUE/FALSE gefüllt werden könnte (und über eine Konstante befüllt werden kann).
FAZIT:HMM…
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 32
DEPRECATED PRAGMA
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data Conversion Erweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 33
AGENDA
ES HAT SICH EINIGESGETAN!
Das Package DBMS_PLSQL_CODE_COVERAGE erlaubt uns Daten über die Testabdeckung des von uns getesteten Codes zu sammeln.
Eigenschaften
➢ Daten werden in 3 Tabellen gesammelt
➢ DBMSPCC_RUNS
➢ DBMSPCC_UNITS
➢ DBMSPCC_BLOCKS
➢ Unerreichbarer Code lässt sich kennzeichnen
➢ Sektion
➢ Block
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 34
DBMS_PLSQL_CODE_COVERAGE
FÜR DAS TESTENTOLL!
Erstellen der notwendigen Tabellen:
Die Tabellen können auch zentral angelegt und über Synonyme und Grants dem Test -Ausführenden zur Verfügung gestellt werden.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 35
CODE COVERAGE PACKAGE
REPOSITORY
begin
sys.dbms_plsql_code_coverage.create_coverage_tables();
end;
/
O12R2_CodeCoverage0.sql
Erstellen eines Test-Packages
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 36
CODE COVERAGE PACKAGE
CREATE OR REPLACE PROCEDURE coveragetest(in_param IN INTEGER) AS
l_res INTEGER := in_param mod 2;
BEGIN
IF l_res = 0 THEN sys.dbms_output.put_line(in_param || ' is even');
ELSIF l_res = 1 THEN sys.dbms_output.put_line(in_param || ' is odd');
ELSIF l_res IS NULL THEN sys.dbms_output.put_line(in_param || ' is null');
ELSE sys.dbms_output.put_line(in_param || ' is unknown');
END IF;
END coveragetest;
/
O12R2_CodeCoverage1.sql
Zu beachten: Run Comment „Coverage Test 1“ ist kein Unique Key, heisst, es kann in den Tabellen, mehrere Testläufe mit dem gleichen Run Comment haben.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 37
CODE COVERAGE PACKAGE
DECLARE
l_run_id pls_integer;
BEGIN
l_run_id :=
sys.dbms_plsql_code_coverage.start_coverage('Coverage Test 1');
coveragetest(100);
sys.dbms_plsql_code_coverage.stop_coverage();
END;
/DURCHFÜHRUNGTEST
Analyse der Testabdeckung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 38
CODE COVERAGE PACKAGE
SELECT r.run_comment ,u.owner ,u.name ,u.type
,ROUND((COUNT(CASE b.covered WHEN 1 THEN 1 ELSE NULL END)
+ COUNT(CASE WHEN b.covered = 0
AND b.not_feasible = 1 THEN 1 ELSE NULL END))
/ NULLIF(COUNT(*),0) * 100,2) AS pct_covered
FROM dbmspcc_runs r
JOIN dbmspcc_units u ON (u.run_id = r.run_id)
JOIN dbmspcc_blocks b ON (b.object_id = u.object_id AND b.run_id = r.run_id)
GROUP BY r.run_comment ,u.owner ,u.name ,u.type;
RUN_COMMENT OWNER NAME TYPE PCT_COVERED
-------------------- ---------------- -------------------- -------------------- -----------
Coverage Test 1 TEST COVERAGETEST PROCEDURE 28.57
Erstellen eines weiteren Test-Packages mit „not feasible“ + Testrun „Coverage Test 2“ gleiche Parameter
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 39
CODE COVERAGE PACKAGE
CREATE OR REPLACE PROCEDURE coveragetest2(in_param IN INTEGER) AS
l_res INTEGER := in_param mod 2;
BEGIN
IF l_res = 0 THEN sys.dbms_output.put_line(in_param || ' is even');
ELSIF l_res = 1 THEN sys.dbms_output.put_line(in_param || ' is odd');
ELSIF l_res IS NULL THEN sys.dbms_output.put_line(in_param || ' is null');
ELSE
PRAGMA COVERAGE ('NOT_FEASIBLE');
sys.dbms_output.put_line(in_param || ' is unknown');
END IF;
END coveragetest2;
O12R2_CodeCoverage2.sql
Erneute Analyse der Testabdeckung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 40
CODE COVERAGE PACKAGE
RUN_COMMENT OWNER NAME TYPE PCT_COVERED
-------------------- --------------- -------------------- --------------- -----------
Coverage Test 1 TEST COVERAGETEST PROCEDURE 28.57
Coverage Test 2 TEST COVERAGETEST2 PROCEDURE 42.86
➢ Ermöglicht uns präzise Aussagen darüber, welche Code-Teile getestet worden sind.
➢ Ermöglicht gezielte Tests. FAZIT:SEHR NÜTZLICH
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 41
CODE COVERAGE PACKAGE
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data Conversion Erweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 42
AGENDA
ES HAT SICH EINIGESGETAN!
➢ Collation legt fest, wie Strings verglichen werden.
➢ Es ermöglich Vergleiche ohne Berücksichtigung von Gross-/Kleinschreibung und Akzenten
➢ Dies wirkt sich auf die Sortierung und den Vergleich von Strings aus.
➢ Mit ORACLE 12.2 erhalten wir die Möglichkeit auf verschiedenen Ebenen die zu verwendende Collation zu definieren:
➢ Spalte
➢ Tabelle
➢ Schema
➢ Session
➢ Datenbank
➢ Statement
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 43
COLLATION (STRINGVERGLEICH)
KOMMT EINBISSCHEN SPÄT
➢ Voraussetzungen:
➢ ORACLE 12.2
➢ MAX_STRING_SIZE auf Extended gesetzt
➢ COMPATIBLE Parameter 12.2
➢ Zwei verschiedene Collation Typen
➢ Binary
➢ Linguistisch
➢ Zwei verschiedene Verhaltensweisen
➢ _CI = Case Insensitive
➢ _AI = Accent und Case Insensitive
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 44
COLLATION (STRINGVERGLEICH)
Erstellen einer Tabelle mit einer Case-Insensitiven und einer Case/Accent-InsensitivenSpalte
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 45
COLUMN LEVEL COLLATION
CREATE TABLE collate_test (
default_string VARCHAR2(100)
,ci_string VARCHAR2(100) COLLATE binary_ci
,ai_string VARCHAR2(100) COLLATE german_ai
);
insert into collate_test values ('MÜLLER','MÜLLER','MÜLLER');
insert into collate_test values ('Müller','Müller','Müller');
insert into collate_test values ('mÜLLER','mÜLLER','mÜLLER');
insert into collate_test values ('Mûller','Mûller','Mûller');
insert into collate_test values ('Muller','Muller','Muller');
insert into collate_test values ('Múllër','Múllër','Múllër');
O12R2_Collation1.sql
Überprüfen der Collation
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 46
COLUMN LEVEL COLLATION
SELECT COUNT(DISTINCT default_string) AS "Default"
,COUNT(DISTINCT ci_string) AS "Case Insensitive"
,COUNT(DISTINCT ai_string) AS "Accent Insensitive"
FROM collate_test;
Default Case Insensitive Accent Insensitive
---------- ---------------- ------------------
6 4 1
Überprüfen der Collation – Abfrage auf die Spalte „Default_String“
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 47
COLUMN LEVEL COLLATION
SELECT *
FROM collate_test
WHERE default_string like '%ü%';
DEFAULT_STRING CI_STRING AI_STRING
-------------------- -------------------- --------------------
Müller Müller Müller
DEFAULT STRING
Überprüfen der Collation – Abfrage auf die Spalte „AI_STRING“
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 48
COLUMN LEVEL COLLATION
SELECT *
FROM collate_test
WHERE ai_string like '%ü%';
DEFAULT_STRING CI_STRING AI_STRING
-------------------- -------------------- --------------------
MÜLLER MÜLLER MÜLLER
Müller Müller Müller
mÜLLER mÜLLER mÜLLER
Mûller Mûller Mûller
Muller Muller Muller
Múllër Múllër Múllër
ACCENT/CASE INSENSITIVE
➢ Kann bei CREATE TABLE angegeben werden (DEFAULT COLLATION)
➢ Kann über ALTER TABLE angepasst werden
➢ Wirkt sich nicht auf schon existierende Spalten dieser Tabelle aus, sondern lediglich auf später hinzugefügte.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 49
TABLE LEVEL COLLATION
IST EIN DEFAULT VERHALTEN
O12R2_Collation2.sql
Anlegen einer neuen Tabelle mit der Default Collation „GERMAN_AI“
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 50
TABLE LEVEL COLLATION
CREATE TABLE collate_test2 (col1 VARCHAR2(30))
DEFAULT COLLATION GERMAN_AI
/
insert into collate_test2 values ('Müller');
ALTER TABLE collate_test2 DEFAULT COLLATION GERMAN_CI;
ALTER TABLE collate_test ADD (col2 VARCHAR2(30));
insert into collate_test2 values ('Müller','Müller');
Die Collation ist in …_TAB_COLUMNS hinterlegt
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 51
TABLE LEVEL COLLATION
SELECT column_name, collation
FROM user_tab_columns
WHERE table_name = 'COLLATE_TEST2';
COLUMN_NAME COLLATION
------------------------------ ---------------------------
COL1 GERMAN_AI
COL2 GERMAN_CI DATA DICTIONARY
➢ Sortieren
➢ Suchen
➢ Gruppieren
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 52
STATEMENT LEVEL COLLATION O12R2_Collation3.sql
➢ Auf Spalten, die nicht explizit case/accent-insensitive angelegt worden sind über:
➢ COLLATE
➢ NLSSORT
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 53
STATEMENT LEVEL COLLATION - SORTIEREN
SELECT *
FROM collate_test3
ORDER BY default_string COLLATE BINARY_CI;
SELECT *
FROM collate_test3
ORDER BY NLSSORT(default_string,'NLS_SORT=BINARY_CI');
CASE INSENSITIVE ORDER BY
➢ Auf Spalten, die nicht explizit case/accent-insensitive angelegt worden sind über:
➢ COLLATE
➢ NLSSORT
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 54
STATEMENT LEVEL COLLATION - GRUPPIEREN
SELECT default_string COLLATE GERMAN_AI, count(*)
FROM collate_test3
GROUP BY default_string COLLATE GERMAN_AI;
DEFAULT_STRING COUNT(*)
----------------------------- ----------
Müller 6GROUP BY
➢ Auf Spalten, die nicht explizit case/accent-insensitive angelegt worden sind, kann über: COLLATE oder NLSSORT gesucht werden.
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 55
STATEMENT LEVEL COLLATION - SUCHEN
SELECT *
FROM collate_test3
WHERE default_string COLLATE GERMAN_AI
LIKE '%u%' COLLATE GERMAN_AI;
DEFAULT_STRING
----------------------------------------------------------
Müller
MULLER
MÛLLER
...
SUCHEN AUF “NORMALEN” SPALTEN
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 56
COLLATION INDIZIERUNG
➢ Auf Columns mit „Named Collations“ werden immer funktionsbasierte Indexe erzeugt
➢ Zudem wird zum Zeitpunkt der Indizierung auch eine virtuelle Spalte (hidden) angelegt
O12R2_Collation4.sql
SELECT column_name, data_type, data_length, column_id, data_default
FROM user_tab_cols
WHERE table_name = 'COLLATE_TEST';
COLUMN_NAME DATA_TYPE DATA_LENGTH COLUMN_ID DATA_DEFAULT
--------------- --------- ----------- --------- -----------------------------------------------
DEFAULT_STRING VARCHAR2 400 1
CI_STRING VARCHAR2 400 2
AI_STRING VARCHAR2 400 3
COL2 VARCHAR2 120 4
SYS_NC00005$ RAW 3210 NLSSORT("AI_STRING",'nls_sort=''GERMAN_AI''')
SYS_NC00006$ RAW 600 NLSSORT("CI_STRING",'nls_sort=''BINARY_CI''')
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 57
COLLATION INDIZIERUNG
➢ Auch auf Columns ohne „Named Collations“ kann ein function based Index erzeugt werden
➢ Auch dies erzeugt eine virtuelle Spalte auf der entsprechenden Tabelle (allerdings ohne Korrelation)
O12R2_Collation4.sql
SELECT column_name, column_id, data_default, collation, collated_column_id
FROM user_tab_cols uc
WHERE table_name = 'COLLATE_TEST3';
COLUMN_NAME DATA_TYPE DATA_LENGTH COLUMN_ID DATA_DEFAULT
--------------- --------- ----------- ---------- ---------------------------------------------
DEFAULT_STRING VARCHAR2 400 1
CI_STRING VARCHAR2 400 2
AI_STRING VARCHAR2 400 3
COL2 VARCHAR2 120 4
SYS_NC00005$ RAW 3210 NLSSORT("AI_STRING",'nls_sort=''GERMAN_AI''')
SYS_NC00006$ RAW 600 NLSSORT("CI_STRING",'nls_sort=''BINARY_CI''')
➢ Collations können auch in Views verwendet werden um z.B. eine linguistische Sortierung einer nicht mit einer named collation belegten Spalte zu ermöglichen.
➢ Oder zu Suchen
➢ Oder zu Gruppieren
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 58
VIEWS USING COLLATION
COLLATION IN VIEWS
O12R2_Collation5.sql
➢ Prinzipiell gut
➢ Werden wir deswegen auf extended varchar2 support umstellen?
➢ Wie oft brauchen wir dies?
➢ Falls wir es brauchen, ist es sicherlich schon anders gelöst…
FAZIT:GUT, ABER
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 59
COLLATION
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data Conversion Erweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 60
AGENDA
ES HAT SICH EINIGESGETAN!
➢ Seit er ORACLE Version 11.1 steht mit PL/Scope ein Tool zur Verfügung, welches den PL/SQL Code zur Kompilierungszeit analysiert und Information über darin verwendete Komponenten (Identifiers, Program Units) zur Verfügung stellt.
➢ Bisher hat sich die Analyse auf den PL/SQL Code beschränkt, statisches SQL wurde ignoriert.
➢ Die Version 12.2 schliesst diese Lücke und schreibt statische SQL in die Tabelle DBA_STATEMENTS
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 61
PL/SCOPE ERWEITERUNGEN
WER KENNTPL/SCOPE?
➢ Diese Erweiterung erlaubt es uns gleiche SQL-Statements, welche an verschiedenen Orten verwendet werden zu erkennen.
➢ Eine CRUD-Liste aufzubauen
➢ Abhängigkeiten genauer zu erkennen
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 62
PL/SCOPE ERWEITERUNGEN
TÖNT GUT UND ISTES AUCH…
O12R2_PLSCOPE1.sql
➢ Es bietet sich an, vorgefertigte Views zu verwenden, welche die PL/SCOPE Auswertungen „lesbarer“ machen
➢ Beispiel: https://github.com/PhilippSalvisberg/plscope-utils
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 63
PL/SCOPE ERWEITERUNGEN
HILFSMITTEL
O12R2_PLSCOPE2.sql
➢ Mit diesen Erweiterungen wird PL/SCOPE endlich zum fliegen kommen.
➢ Erkenntnisse, die man nun durch PL/SCOPE gewinnen kann sind sehr wertvoll.
FAZIT:JAWOHL!
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 64
PL/SCOPE ERWEITERUNGEN
Lange Namen für ORACLE Objekte
LISTAGG Erweiterungen
Data Conversion Erweiterungen
Deprecated Pragma
Code Coverage
Collation
PLSCOPE Erweiterungen
Whitelist Erweiterung
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 65
AGENDA
ES HAT SICH EINIGESGETAN!
➢ ORACLE 12.1 gab uns die Möglichkeit auf Eben Program Unit (Package, Prozedur, Funktion oder Object Type) zu entscheiden, welche andere Program Unit darauf zugreifen darf.
➢ ORACLE 12.2 verfeinert dieses Konzept so, dass neu auf Stufe Package Prozedur / Package Function / Object Type Methode definiert werden kann, welche andere Program Units darauf zugreifen dürfen.
➢ Definieren in Spezifikation UND im Body
➢ Verletzung führt zu PLS-00904 während Kompilation
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 66
WHITELIST ERWEITERUNG (ACCESSIBLE BY)
SCHON BENUTZT?
CREATE OR REPLACE PACKAGE BODY emp_tapi IS
-- ==========================================================
-- insert
-- ==========================================================
PROCEDURE ins (emp_tapi_rec IN OUT NOCOPY emp_tapi_rect)
ACCESSIBLE BY (PACKAGE EMP_MAINT_UP.newEmp)
IS
BEGIN
...
END ins;
...
Beispiel:
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 67
WHITELIST ERWEITERUNG (ACCESSIBLE BY)
BESSEREKONTROLLE
➢ Ich glaube trotzdem nicht daran, dass dies oft benutzt werden wird…
FAZITGUT
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 68
WHITELIST ERWEITERUNGEN
WIR HABEN EINIGES GESEHEN, ABER ES GIBT NOCH SO VIEL MEHR…
01.06.2017ORACLE 12.2 - NEW FEATURES FÜR SQL & PL/SQL ENTWICKLER 69
• JSON• PARTITIONING• ANALYTIC VIEWS• ETC.
DANKE