28. April 2010

WE8ISO... Was? Zeichensatznamen in Oracle ...

English title: WE8ISO... What? Character Set Names in Oracle

Wie alle wissen, verwendet Oracle, wenn es um Encodings geht, eigene Namen. Der Zeichensatz UTF-8 ist bei Oracle AL32UTF8, die hierzulande häufig verwendete Codepage iso-8859-1 heißt WE8ISO8859P1 und so weiter ... Aber was ist, wenn man mal eine Codepage einstellen muss, die man nicht so gut kennt ...? Beispielsweise IT oder JP oder ISO-2022-JP. Letzteres lässt sich bspw. nicht einfach nach WE8ISO2022JP übersetzen ...
As we all know: Oracle uses own names for character sets. And for the commonly used encodings we all know the names: UTF-8 is AL32UTF8, Windows-1252 is WE8MSWIN1252 and so on. But what if you need to set NLS_LANG to a characterset which Oracle name you just don't know ...? Examples are IT, J or ISO-2022-JP. The latter one might lead to WE8ISO2022JP - but that would be wrong.
Ein Blick Handbuch hilft natürlich immer weiter - aber auch die Datenbank ist in der Lage, die Oracle-Bezeichnungen in die auch anderswo üblichen "IANA"-Namen zu übersetzen. So übersetzt das folgende SELECT mit Hilfe der Funktion UTL_I18N.MAP_CHARSET von IANA nach Oracle ...
A quick look into documentation does always help - of course. But the database can also translate charset names - the following query uses the function UTL_I18N.MAP_CHARSET. First we translate IANA to Oracle names.
SQL> select utl_i18n.map_charset('it',0,1) from dual;

UTL_I18N.MAP_CHARSET('IT',0,1)
----------------------------------------------------------
I7DEC

SQL> select utl_i18n.map_charset('windows-1252',0,1) from dual;

UTL_I18N.MAP_CHARSET('WINDOWS-2152',0,1)
----------------------------------------------------------
WE8MSWIN1252
Setzt man an letzter Stelle statt der 1 eine 0, so übersetzt die Funktion umgekehrt ...
Changing the last parameter from 1 to 0 (zero) the translation works vice versa ...
SQL> select utl_i18n.map_charset('AL32UTF8',0,0) from dual;

UTL_I18N.MAP_CHARSET('AL32UTF8',0,0)
----------------------------------------------------------
UTF-8

SQL> select utl_i18n.map_charset('WE8PC850',0,0) from dual;

UTL_I18N.MAP_CHARSET('WE8PC850',0,0)
--------------------------------------------------------------
CP850
Eine manchmal sicherlich hilreiche Funktion ...
A nice one, isn't it ...

26. April 2010

Webseminar "Daten laden" am Mittwoch, 28. April um 11:00!

Am Mittwoch, 28. April um 11:00 Uhr findet ein Webseminar zum Thema Laden und Transportieren von Daten statt.

Wie können Daten schnell und effizient in die Datenbank geladen werden? Der Webcast gibt einen Überblick über die Möglichkeiten und eine Einschätzung der Nutzung. Dabei werden die Möglichkeiten vom performanten INSERT, über Verwendung von EXTERNAL TABLES bis zum Transport von Tablespaces zwischen Datenbanken aufgezeigt. Der Webcast erläutert die Funktionsweise und illustriert am Beispiel den Einsatz.

Mehr Information auf der Oracle Webseite. Viel Spaß beim Zuhören ...
This posting is about a german webseminar and therefore available in german only.

19. April 2010

Kaum bekannte Datenbankfeatures: Video-Metadaten auslesen ...

English title: What you might did not know about your database: Read Video Properties

Heute habe ich ein weiteres Feature aus der Reihe Kaum bekannte Features der Oracle-Datenbank. Wusstet Ihr schon, dass Ihr auch videospezifische Metadaten aus einem BLOB lesen könnt ...?
Did you know that the Oracle database can read metadata from a video file (which is present as a BLOB) ...?
Alles, was Ihr braucht, ist das Video als BLOB - es kann sich also als ein solcher in einer Tabelle befinden oder als BFILE im Dateisystem; es muss lediglich als BLOB erreichbar sein. Für den Zugriff auf das Dateisystem benötigt Ihr allerdings noch ein DIRECTORY-Objekt. Und der Code zum Auslesen der Properties sähe dann so aus (dieses Beispiel liest das Video per BFILE aus dem Dateisystem) ...
The BLOB can either reside in a database table or in the filesystem - use a directory object and the BFILENAME function in the latter case. The code to read the properties might then look as follows (this example reads the video file from the filesystem) ...
declare
  l_ctx        raw(32767) := null;
  l_attributes clob;
  l_mimetype   varchar2(32767);
  l_format     varchar2(32767);
  l_width      number;
  l_height     number;
  l_frameres   number;
  l_framerate  number;
  l_videodur   number;
  l_numframes  number;
  l_comptype   varchar2(32767);
  l_numcolors  number;
  l_bitrate    number;

  l_video      bfile;
begin
  l_video := bfilename('{Directory-Objekt}', ' {Video-Filename}');
  dbms_lob.createtemporary(l_attributes, true, dbms_lob.call);
  ordvideo.getproperties(
    ctx             => l_ctx,
    videobfile      => l_video,
    attributes      => l_attributes,
    mimetype        => l_mimetype,
    format          => l_format,
    width           => l_width,
    height          => l_height,
    frameresolution => l_frameres,
    framerate       => l_framerate,
    videoduration   => l_videodur,
    numberofframes  => l_numframes,
    compressiontype => l_comptype,
    numberofcolors  => l_numcolors,
    bitrate         => l_bitrate
  );
  dbms_output.put_line('MIMETYPE:         '||l_mimetype);
  dbms_output.put_line('FORMAT:           '||l_format);
  dbms_output.put_line('WIDTH:            '||l_width);
  dbms_output.put_line('HEIGHT:           '||l_height);
  dbms_output.put_line('FRAME RESOLTION:  '||l_frameres);
  dbms_output.put_line('VIDEO DURATION:   '||l_videodur);
  dbms_output.put_line('NUMBER OF FRAMES: '||l_numframes);
  dbms_output.put_line('COMPRESSION TYPE: '||l_comptype);
  dbms_output.put_line('NUMBER OF COLORS: '||l_numcolors );
  dbms_output.put_line('BITRATE:          '||l_bitrate);
end;
/
Die Funktion selbst befindet sich im Datentypen ORDVIDEO - dieser hat eine Methode GETPROPERTIES, welche die Metadaten ausliest. Leider werden bei weitem nicht alle gängigen Videoformate unterstützt - so war ich mit mp4-Dateien erfolgreich, während WMV-Dateien nicht funktionierten. Out-Of-The-Box unterstützt Oracle halt nur eine eingeschränkte Anzahl an Videoformaten. Was der ORDVIDEO-Typ noch alles kann, erfahrt Ihr im Oracle-Handbuch; darin finden sich auch ein paar (wenn auch sehr rudimentäre) Abschnitte, wie man die Funktionalität erweitern kann.
The functionality is part of the ORDVIDEO type. Its method GETPROPERTIES reads various metadata attributes in PL/SQL variables. Unfortunately it has only limited support for common video formats. I was successful with MP4 files whereas Windows Media files (WMV) threw an error message. The Oracle documentation contains more information about ORDVIDEO and also some hints how to extend the functionality.

7. April 2010

SQL*Plus Miniskript zum schnellen Finden von DB-Objekten

English title: Miniscript for looking up object names

Bereits vor einiger Zeit war hier mal ein Blog-Posting mit Kommando-Abkürzungen für SQL*Plus (Miniskripts mit SQL*Plus). Damit kann man häufig benötigte Kommandos einfach durch kürzere Skriptnamen ersetzen. Das Posting enthält auch ein paar Beispiele, die ich selbst recht häufig nutze.
Some time ago I had a blog posting about "command shortcuts" for SQL*Plus (Path variable for SQL script: SQLPATH). Frequently used SQL statements can then be replaced with shorter script names. The posting also contains some example which I actually use quite often.
Heute habe ich ein Neues: Ich selbst suche in SQL*Plus recht oft bestimmte Objekte (Prozedurnamen oder Views). Und dann geht man halt hin und sucht in der ALL_OBJECTS-View - ist ja auch kein Problem. Aber einige Tipperei. Eine Lösung könnte das hier sein ...
Here is a new one: I'm frequently looking for spcific objects in SQL*Plus. Most often I then use the ALL_OBJECTS view to lookup the exact object name (which I need for describe or using it). This is not rocket science - but a lot of typing. This one might help ...
col object_name format a30
col object_type format a20
col owner       format a15
set pages 30
set verify off
set lines 120


select owner, object_name, object_type
from all_objects 
where 
(upper(owner) like '%'||substr(upper('&1'), 1, instr(upper('&1'), ',', 1) - 1)||'%') and
(upper(object_type) like '%'||substr(upper('&1'), instr(upper('&1'),',', 1) + 1, instr(upper('&1'),',', -1) - (instr(upper('&1'),',', 1) + 1))||'%') and
(upper(object_name) like '%'||substr(upper('&1'), instr(upper('&1'), ',', instr(upper('&1'), ',', 1)+1 ) + 1)||'%') and
rownum <50
/

undefine 1
Speichert die Datei in dem Verzeichnis ab, auf das die Umgebungsvariable SQLPATH zeigt. Gebt der Datei einen kurzen Namen, bspw. "lo" für "list objects". Dann könnt Ihr Sie wie folgt nutzen:
Save the file in the directory which the environment variable SQLPATH points to and give a short name - say "lo" for "list objects". Then use it as follows:
SQL> @lo {owner,object-type,object-name}

SQL> @lo ,vie,APEX_APP%REG

OWNER           OBJECT_NAME                    OBJECT_TYPE
--------------- ------------------------------ --------------------
APEX_030200     APEX_APPLICATION_PAGE_REGIONS  VIEW
APEX_030200     APEX_APPLICATION_TEMP_REGION   VIEW
Nach dem Skriptnamen kommt ein Parameter, in dem Ihr durch Komma getrennt eine Angabe zum Owner, zum Typen und zum Namen machen könnt. Ihr könnt Angaben weglassen, die zwei Kommas müssen aber auf jeden Fall da sein. Das Skript rahmt jede Angabe mit Prozentzeichen (%) ein und macht eine LIKE-Suche.
The script name is followed by one argument which contains search criteria for owner, object type and object name. You can omit criteria but the two commas must be present in all cases. The script wraps the criteria with percent signs (%) and performs a LIKE search.
1. Zeige mir die Views, die was mit NLS zu tun haben
1. Show me the views containing NLS information
SQL> @lo ,vie,nls

OWNER           OBJECT_NAME                    OBJECT_TYPE
--------------- ------------------------------ --------------------
SYS             V_$NLS_PARAMETERS              VIEW
SYS             V_$NLS_VALID_VALUES            VIEW
SYS             GV_$NLS_PARAMETERS             VIEW
SYS             GV_$NLS_VALID_VALUES           VIEW
SYS             NLS_SESSION_PARAMETERS         VIEW
SYS             NLS_INSTANCE_PARAMETERS        VIEW
SYS             NLS_DATABASE_PARAMETERS        VIEW
SYS             EXU9NLS                        VIEW
2. Standalone-Prozeduren im APEX..-Schema
2. Which standalone procedures are available in the APEX...-Schema
SQL> @lo apex,pro,

OWNER           OBJECT_NAME                    OBJECT_TYPE
--------------- ------------------------------ --------------------
APEX_030200     WWV_FLOW_INIT_HTP_BUFFER       PROCEDURE
APEX_030200     F                              PROCEDURE
APEX_030200     APEX                           PROCEDURE
APEX_030200     DEVELOPMENT_SERVICE_HOME       PROCEDURE
APEX_030200     HTMLDB                         PROCEDURE
APEX_030200     HTMLDB_LOGIN                   PROCEDURE
APEX_030200     DEVELOPMENT_SERVICE_HOME_LOGIN PROCEDURE
APEX_030200     DEVELOPMENT_SERVICE_SIGNUP     PROCEDURE
APEX_030200     Z                              PROCEDURE
APEX_030200     G                              PROCEDURE
APEX_030200     P                              PROCEDURE
APEX_030200     APEX_ADMIN                     PROCEDURE
APEX_030200     HTMLDB_ADMIN                   PROCEDURE
3. Wie war doch der Name der View mit den Details zur Ausführung eines Scheduler-Jobs?
3. What was the name of the view containing the details about a scheduler job run?
SQL> @lo ,v,scheduler%job%det

OWNER           OBJECT_NAME                    OBJECT_TYPE
--------------- ------------------------------ --------------------
SYS             DBA_SCHEDULER_JOB_RUN_DETAILS  VIEW
SYS             USER_SCHEDULER_JOB_RUN_DETAILS VIEW
SYS             ALL_SCHEDULER_JOB_RUN_DETAILS  VIEW
Viel Spaß damit. Wenn Ihr auch mit SQL*Plus arbeitet und solche "Miniskripts" habt - ich bin stets interessiert!
Have fun! If you're also working with SQL*Plus and you have such "miniscripts" - I'm always interested ...

Beliebte Postings