Posts

Es werden Posts vom 2010 angezeigt.

pipelined functions in oracle

Eine sehr gute Erklärung zu piplined functions findet sich bei oracle-developer.net . Es werden verschiedene Möglichkeiten beschrieben und auf die Unterschiede zwischen materialisierten und pipelined Funktionen hinsichtlich Antwortverhalten und Speicherbedarf eingegangen. Der für mich wichtigste Punkt: Es gibt die Möglichkeit, ohne (PL-Paket-)externe Datentypen auszukommen. D.h. alle benötigten Struktuen können innerhalb eines PL-Paketes deklariert werden. Dies sollte die Wartung deutlich vereinfachen. Mit folgenden Zeilen werden alle benötigten Objekte in der Paket-Spezifikation angelegt: TYPE foo_rt IS RECORD (); --Record-Typ anlegen TYPE foo_ntt IS TABLE OF foo_rt; --Collection definieren FUNCTION my_pipeline ( -- pipelined function definieren p1 in varchar2, -- Parameter 1 p2 in number) -- Parameter 2 RETURN foo_ntt PIPELINED; Im Paket-Body wird die eigentliche Logik hinterlegt: FOR r_tmp IN c_sql LOOP PIPE ROW (r_tmp); END LOOP; RETURN; Aufgerufen wird das ganze am Ender per s

Hintergrundbild bei Dual-Monitorbetrieb

Bei Dual- oder mehr -Monitorbetrieb unter Windows wäre es natürlich sehr schön, wenn man 1 Hintergrundbild über ALLE Monitore legen kann. Netterweise geht das mit Windows-Bordmitteln: ein entsprechend großes Bild erstellen Bsp: Zwei Monitore mit 1600x1200 Auflösung stehen nebeneinander -> Größe des Hintergrundbildes: 3200 (=1600+1600) x 1200 dieses Bild als Hintergrundbild auswählen und bei Ausrichtung die Option "Nebeneinander" wählen fertig! Quelle: http://www.gwegner.de/allgemein/tipp-hintergrundbild-ueber-mehrere-monitore-ohne-zusatzsoftware-in-windows/

Inline-Fehlermeldungen formatieren

Für die Formatierung der Inline-Fehlermeldungen gibt es mehrere Möglichkeiten. Hier eine Variante, die die über das Template-CSS vorgegebene Formatierung ändert, ohne das CSS selbst anzupassen: - über Shared Components - Templates - die LABEL -Templates des aktiven Themes selektieren - im Bereich Error Display die Formatierung anpassen: Bsp: On Error Before Label alt:<div class="t20InlineError"> neu: leer On Error After Label alt: <br/>#ERROR_MESSAGE#</div> neu: <br/><div style="color:red; font-weight:bold">#ERROR_MESSAGE#</div>

Anzeige der aktuellen Systemumgebung

Für die Anzeige, auf welcher Systemumgebung gerade gearbeitet wird, gibt es verschiedenste Möglichkeiten. Hier eine Variante, die mit einer HTML-Region auf Seite 0 arbeitet. - für die Darstellung wird ein hidden Item :P0_UMGEBUNG genutzt - die html-Region wird in Page Template Region Position 7 gestellt (oben zwischen Logo und Logout-Button) - Region Source: <p style="text-align:center; font:bold x-large serif; color:yellow; ">&P0_UMGEBUNG. </p> - über einen App Prozess wird bei Neuinstanziierung einmalig die Variable gesetzt: CASE SYS_CONTEXT ('USERENV', 'DB_NAME') WHEN 'DB71PI' THEN :p0_umgebung := null; WHEN 'DB71RI' THEN :p0_umgebung := 'Testumgebung'; WHEN 'DB71EI' THEN :p0_umgebung := 'Entwicklung'; ELSE :p0_umgebung := 'ACHTUNG: unbekanntes System'; END CASE; - das wars! Im Ergebnis wird in Abhängigkeit d

APEX: Standardmeldungen anpassen

Über Shared Components/Text Messages können u.a. auch die APEX-Standardmeldungen angepasst/übersetzt werden. Bsp: Über den Text (als Name zu erfassen) APEX.PAGE_ITEM_IS_REQUIRED kann der Standardtext #LABEL# must have some value. z.B. in #LABEL# darf nicht leer sein. angepasst werden. Wichtig ist die Angabe der Sprache, für die diese Übersetzung gelten soll. Weiteres findet sich in der APEX-Hilfe unter Translating Messages Used Internally by Oracle Application Express

APEX 4.0.2 Patch verfügbar

...wie erwartet gibt es - nach den vielen Neuerungen in APEX 4 - nun bereits den zweiten Patch: 4.0.2 siehe auch http://joelkallman.blogspot.com/2010/11/oracle-application-express-402-released.html

Basispaket mit Logging und Errorhandling für PL-/APEX-Anwendungen

Zum Logging von PL-Funktionen nutze ich eine Tabelle je Schema sowie eine einheitliche LOG-Funktion zum Mitschreiben relevanter Einträge: Tabelle: DROP TABLE AX_LOG CASCADE CONSTRAINTS; CREATE TABLE AX_LOG ( DATUM TIMESTAMP(6), PCK VARCHAR2(255 CHAR), MODUL VARCHAR2(255 CHAR), TEXT VARCHAR2(1000 CHAR), OS_USR VARCHAR2(255 CHAR), AX_USR VARCHAR2(255 CHAR) ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING; COMMENT ON TABLE AX_LOG IS 'Log-Tabelle zur APEX-Anwendung; FS - 04.08.2010'; COMMENT ON COLUMN AX_LOG.DATUM IS 'Zeitstempel des Eintrags'; COMMENT ON COLUMN AX_LOG.PCK IS 'PL-Paket'; COMMENT ON COLUMN AX_LOG.MODUL IS 'Anwendungsmodul'; COMMENT ON COLUMN AX_LOG.TEXT IS 'Logtext'; COMMENT ON COLUMN AX_LOG.OS_USR IS 'Betriebsystem-Benutzer'; COMMENT ON COLUMN AX_LOG.AX_USR IS 'APEX-Benutzer'; PL-Paket: create or replace package Test is -- Author : SCHMIFA -- Created : 24.11.2010 09:19:54 procedure bla --

APEX - PL-Funktion für Standardbelegung von select-Lists

Hintergrund: APEX-Select-Listen sollen mit einem bestimmten Wert initialisiert werden. Da die zugrundeliegenden DIM-Tabellen manuell gepflegt werden, muss die entsprechende ID dynamisch bestimmt werden. -> Dies übernimmt diese Funktion. Es können grundsätzlich a) EINE Zeile oder b) keine Zeile (oder Fehler) gefunden werden. Für a) wird die ID des Eintrags zurückgegeben, wodurch APEX den entsprechenden Eintrag anzeigt. Bei b) wird -1 geliefert. Die select-List muss -1 als Null-Werte erkennen und dann z.B. '- auswählen -' anzeigen APEX-Einbindung für die select-List - unter Default Value den Aufruf eintragen Bsp.: <Paketname.>get_lov_id( 'Wiedervorlage', 'dim_status', 'status', 'status_key', 'and AKTIONSTYP = 'S' and sysdate between GUELTIG_VON and GUELTIG_BIS' ); - als Default Value Type: PL/SQL Expression wählen -- Author : SCHMIFA -- Created : 23.11.2010 09:25:06 -- Purpose : ID zu einem Wert für eine LOV s

Frank zum Cloud Computing

Wenn die private Cloud auf Servergröße geschrumpft ist, schließt sich der Kreis. If the private cloud has shrunk to server size, have come full circle.

Axel E. Fischer fordert ...

Der aktueller Beitrag eines CDU-Politikers zum Thema Internet: Der CDU-Bundestagsabgeordnete Axel E. Fischer kritisiert die gängige Praxis, sich in Internet-Diskussionsforen mit einem Fantasienamen zu Wort zu melden. Ein "Vermummungsverbot im Internet" müsse her, forderte der Vorsitzende der Enquete-Kommission Internet und digitale Gesellschaft des Bundestags. Es könne nicht sein, dass sich Bürger hinter selbstgewählten Pseudonymen versteckten und sich so der Verantwortung entzögen, sagte der Karlsruher Abgeordnete den Badischen Neuesten Nachrichten. Quelle und vollständiger Artikel: http://www.heise.de/newsticker/meldung/CDU-Politiker-fuer-Vermummungsverbot-im-Internet-2-Update-1136033.html Die Genialität dieses Vorschlags fortführend, steuert die Netzgemeinde weitere Vorschläge bei: siehe z.B. http://www.norbert-hense.de/blog/?p=189 oder http://www.netzpolitik.org/2010/meme-axel-e-fischer-fordert/ Mein persönliches Highlights: 1) Axel E. Fischer, CDU, fordert Pflaster für

APEX für BIP einrichten

- BI Publisher installieren - in APEX 4:  * Anmeldung als internal  * Menü: Manager Instance -> Instance Settings  * unter Report   + Print Server -> Advanced   + Protocol -> http/https   + Server, Port und   + Print Server Script -> /xmlpserver/convert eintragen. Fertig :-)

Subscriptions in APEX

Im aktuellen Community-Tipp werden Subscriptions von APEX-Anwendungsteilen beschrieben. Mit Subscriptions kann auf Master-Objekte referenziert werden, die so zentral geändert werden können (Bsp.: Logo's, Authentifizierungsschemas etc.). Im Tipp wird eine einheitliche Anwendungs-ID für die Masteranwendung genutzt, wodurch die Master-Anwendung sogar gelöscht und wieder neu importiert werden kann. Die Referenzierung wird in die Client-Anwendung gespeichert, nicht in der Master-Anwendung. Änderungen werden per "veröffentlichen" an die Client-Anwendungen weitergegeben. Ungelöst ist die Weitergabe in andere APEX-Instanzen. Bei einer Trennung von Entwicklung, Test und Produktionsumgebung sind in Entwicklung zwar per Knopfdruck alle Anwendungen geändert. Diese Anwendungen müssen aber noch in Produktion kommen, um für den Anwender nutzbar zu sein. Link zum Tipp: http://www.oracle.com/global/de/community/tipps/subscriptions/index.html

Buzzwords der Woche

Es wird wohl keine regelmäßige Kategorie werden, aber diese Woche habe ich zwei neue Wörter kennenlernen dürfen, die auf keiner Party fehlen sollten: Astroturfing und retargeting Die meisten werden wissen worum es geht, sonst einfach mal suchen: http://de.wikipedia.org/wiki/Astroturfing bzw. http://www.google.de/search?q=retargeting Eine praktische Anwendung findet sich z.B. hier: http://www.sueddeutsche.de/politik/streit-um-stuttgart-astroturfing-geheimkampf-um-botschaften-im-netz-1.1008550 Viele Grüße und ein schönes Wochenende...

unbreakable oracle

Bild
Auch Oracle kocht nur mit Wasser (Oracle Forum nicht erreichtbar):

BI Publisher Ressourcen

Neues von Rittman Mead zum Thema BIP: OBIEE 11gR1 : New Features in BI Publisher 11gR1 Creating Federated Data Models using BI Publisher 11gR1

In eigener Sache

Da der neue Blog-Editor in der Firma gesperrt ist, habe ich auf manuelle HTML-Tags in den Beiträgen umgestellt. Aus Effizienzgründen wird daher nur sehr sparsam formatiert werden, z.B. per: <span style="font-family:Courier"> Ich hoffe, die Lesberkeit bleibt erhalten...

APEX 4.0.1 Patch verfügbar

Inzwischen gibt es den ersten Patch zu APEX 4.0. Aus meiner Erfahrung heraus würde ich sagen, dass dies der schnellste Patch war, den Oracle zu APEX je heraus brachte (bringen musste?). Ich hoffe, dass das kein schlechtes Omen für die 4er Version von APEX ist. ICH habe mit einigen Neuerungen bisher jedenfalls noch eine Menge Probleme... Hinweis zur Installation: Für den Wechsel von APEX 4.0 zu APEX 4.0.1 ist der PATCH einzuspielen! Der komplette Download läßt sich NICHT drüberinstallieren. Im Forum gibt es einen Weg, wie auf dem Komplettdownload der Patch installiert werden kann: Link zum Forum: http://forums.oracle.com/forums/thread.jspa?threadID=1116969&tstart=0

DBMS_LDAP mit Anbindung an primären und sekundären Domain Controller (active directory)

Ein Pwd-Test gegen ein active directory (AD) - z.B. für eine APEX-Anwendung - kann in PL/SQL z.B. so aussehen: excp_ldap EXCEPTION; -- LDAP-Fehler PRAGMA EXCEPTION_INIT(excp_ldap, -31202); LDAP_HOST VARCHAR2(512); -- The LDAP Directory Host LDAP_PORT VARCHAR2(512); -- The LDAP Directory Port RETVAL PLS_INTEGER; -- Used for all API return values. MY_SESSION DBMS_LDAP.SESSION; -- Used to store our LDAP Session begin -- AD-Serverdaten LDAP_HOST := c_LDAP_HOST; log(c_Modul, 'versuche LDAP_HOST: ' || LDAP_HOST, P_LOG); -- Test, ob User-Pwd ok MY_SESSION := DBMS_LDAP.INIT(LDAP_HOST, null); RETVAL := DBMS_LDAP.SIMPLE_BIND_S(MY_SESSION, P_USERNAME, P_PASSWORD); RETVAL := DBMS_LDAP.UNBIND_S(MY_SESSION); log(c_Modul, 'LDAP Bind mit Userame ' || P_USERNAME || ' erfolgreich', P_LOG); return(true); exception when excp_ldap then RETVAL := DBMS_LD

External Table zum Einlesen von Dateien

1) Verzeichnis erzeugen: DROP DIRECTORY data_dir; CREATE DIRECTORY data_dir AS 'D:\oraclexe\ext_file'; -- Windows CREATE DIRECTORY data_dir AS '/oraclexe/ext_file'; -- Unix 2) Rechte vergeben GRANT READ, WRITE ON DIRECTORY data_dir TO usr; 3) Ext. Tabelle erstellen: (Es werden nur die Metadaten angelegt!) CREATE TABLE kvdt_ext ( dateiname VARCHAR2 (1000 CHAR) , zeile NUMBER , feldlaenge NUMBER (3) , feldkennung NUMBER (4) , feldinhalt VARCHAR2 (1000 CHAR) ) ORGANIZATION EXTERNAL ( TYPE oracle_loader DEFAULT DIRECTORY data_dir ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS ( zeile RECNUM, --> Zeilen zählen feldlaenge CHAR(3), feldkennung CHAR(4), feldinhalt CHAR(1000)) COLUMN transforms ( dateiname from constant 'Hallo' --> Konstanten definieren ) ) location ('Dateiname.Endung') ) reject LIMIT unlim

SQL Server - Verbindungsserver einrichten

Einrichten Im Dialog "Neuer Verbindungsserver" Allgemein Verbindungsserver: beliebiger Name Servertyp: "Andere Datenquelle" Anbieter: "Microsoft OLE DB Provider for Oracle" Produktname: MSDORA   Datenquelle: tnsnames-Name der Datenbank Sicherheit in folgendem Sicherheitskontext verwendet: Remoteanmeldung: Oracleuser-Login Mit Kennwort: Oracleuser-Passwort fertig! :-) Benutzen Abfrage erfolgt mit openquery ( http://msdn.microsoft.com/de- de/library/ms188427.aspx ) Bsp.: select * from openquery (DB71E6, 'select * from <schema>.<tabelle> where rownum < 11') go

APEX 4.0 Installation auf Oracle XE (10.2)

In Kurzform hier die Zusammenfassung der Schritte einer APEX 4.0 Installation auf einer lokalen XE-Datenbank unter Windows: - ins SQLPlus wechseln sqlplus sys as sysdba 1) eigentliche APEX-Installation @apexins SYSAUX SYSAUX TEMP /i/ @apexins tablespace_apex tablespace_files tablespace_temp images mit: – tablespace_apex is the name of the tablespace for the Oracle Application Express application user. – tablespace_files is the name of the tablespace for the Oracle Application Express files user. – tablespace_temp is the name of the temporary tablespace. – images is the virtual directory for Oracle Application Express images. To support future Oracle Application Express upgrades, define the virtual image directory as /i/ 2) Admin-Pwd vergeben @apxchpwd 3) APEX-Public-User anpassen ALTER USER APEX_PUBLIC_USER ACCOUNT UNLOCK; ALTER USER APEX_PUBLIC_USER IDENTIFIED BY pwd; 4) Bildpfad angeben @apxldimg.sql D:\apex_4.0 (Verzeichnis, in das das APEX.zip entpackt wur

APEX 4.0 verfügbar

unter http://www.oracle.com/technology/products/database/application_express/index.html gibts erste Infos zu APEX 4.0 Der direkte Download-Link: http://www.oracle.com/technology/products/database/application_express/download.html

Oracle und seine Statistiken

Zum Aktualisieren von Tabellenstatistiken: begin     SYS.dbms_stats.delete_table_stats(user, myTbl );     SYS.DBMS_STATS.gather_table_stats (       ownname        => 'LABP'      ,tabname        => 'myTbl'     ,estimate_percent  => 25     ,block_sample      => TRUE -- besser weglassen!   ,method_opt        => 'FOR ALL INDEXED COLUMNS SIZE 254 '     ,degree            => 4     ,cascade           => TRUE     ,no_invalidate     => FALSE); end; / Zum Prüfen, welche Ergebnisse ermittelt wurden: SELECT column_name, num_distinct      , histogram, num_buckets      , TO_CHAR (last_analyzed, 'yyyy-dd-mm hh24:mi:ss') last_analyzed   FROM user_tab_col_statistics  WHERE table_name = myTbl Quelle: http://structureddata.org/2008/10/14/dbms_stats-method_opt-and-for-all-indexed-columns/

Index benutzt? index used?

Zum Prüfen, ob ein Index auch benutzt wird, sind 3 Schritte nötig: -- Index für Monitoring anschalten alter index myIdx monitoring usage; -- Prüfen, ob Monitoring für Indizes angeschaltet ist und Index verwendet wurde select index_name,monitoring,used,start_monitoring,end_monitoring from v$object_usage; -- Abfrage oder Anwendung ausführen, dann erneut abfragen -- Index für Monitoring wieder abschalten alter index myIdx nomonitoring usage; Quelle: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:439329623515

Mehrere Zeilen zu einer Zeile zusammenfassen - per SQL (ohne 11g LISTAGG)

Immerwieder gebraucht: Mehrere Zeilen einer Abfrage zu einer Liste zusammenzufassen. Eine Lösung per SQL: select fall, MAX(LTRIM(sys_connect_by_path(TXT,', '),', ')) liste from (  select fall , row_number() over (partition by fall order by fall) zeile , nr, txt from ( select 1 fall, 11 Nr, 'Txt 1A' Txt from dual union all select 1 fall, 12, 'Txt 1B' from dual union all select 1 fall, 13, 'Txt 1C' from dual union all select 1 fall, 14, 'Txt 1D' from dual union all select 2 fall, 15, 'Txt 2A' from dual union all select 2 fall, 16, 'Txt 2B' from dual union all select 2 fall, 17, 'Txt 2C' from dual union all select 2 fall, 18, 'Txt 2D' from dual ) ) start with zeile = 1 connect by fall = PRIOR fall and prior zeile = zeile -1 group by fall ; Liefert als Ergebnis: Fall Liste 1    Txt 1A, Txt 1B, Txt 1C, Txt 1D 2    Txt 2A, Txt 2B, Txt 2C, Txt 2D Aufbau des Statements: select 1 f

Gruppierung von Zeilen in Report

Bild
Aufgabenstellung Die fachliche Aufgabe war, in einem Report sowohl Fälle als auch die enthaltenen Scheine optisch zu trennen (bessere Lesbarkeit etc.). Ein Break im Report wäre eine Lösung. Und APEX bietet "von Haus aus" die Möglichkeit, Berichte zu gruppieren (break on first column) -> eigentlich nicht schlecht, ABER grottenlangsam!!! Also improvisieren: Ziel sollte sein, a) einzelne Fälle durch wechselnde Hintergrundfarben voneinander abzuheben -> ähnlich dem standardmäßigem Alternating Row Colors, jedoch nicht für einzelne Zeilen, sonder für Blöcke von Zeilen und b) innerhalb der Fälle einzelne Scheine anhand von Trennlinien abzugrenzen (Nach der letzten Zeile eines Scheins soll eine verstärkte Trennlinie gesetzt werden). Vermutlich gibt es noch andere Möglichkeiten Berichte aufzuhübschen - ich habe mich für folgende Variante entschieden: - zwei zusätzliche Spalten in den Bericht einfügen und - Report-Template anpassen 1) Zusätzliche Spalten Die zus

Checkbox in APEX

zum Thema Check-Box mit APEX 3.2 gibt es zwei Einträge von Patric Wolf: Checkboxes in Tabular Forms – The easy way! und ergänzend Which Tabular Form Column is mapped to which Apex_Application.g_fxx array?