Ich habe gerade wieder einmal ein nützliches PL/SQL-Package entdeckt: ctx_report
Mit ihm bekommt man ein paar Informationen über Context-Indexes. Ist zwar schlecht formatiert, steht aber viel drin.
Vollständigen Artikel lesen »
Hier ein kleines Beispiel wie man mittel JRuby über JDBC sich zu Oracle verbinden kann:
require 'java' module J include_package "java.lang" include_package 'java.sql' end db_user='jruby' db_password=db_user db_host='localhost' db_port=1521 db_sid='XE' url="jdbc:oracle:thin:#{db_user}/#{db_password}@#{db_host}:#{db_port}:#{db_sid}" J::Class.forName("oracle.jdbc.OracleDriver") conn = J::DriverManager.getConnection(url); stmt = conn.createStatement rs = stmt.executeQuery("select object_type, object_name from user_objects") while (rs.next) do puts rs.getString(1)+' '+rs.getString(2) end rs.close stmt.close conn.close()
Falls jemand schon einmal eine ORA-00904 bekommen hat, als er versucht hat einen XMLType in ein CLOB umzuverwandeln, …
SQL> select attributes.getCLOBVal() from product_xv;
select attributes.getCLOBVal() from product_xv
*
ERROR at line 1:
ORA-00904: "ATTRIBUTES"."GETCLOBVAL": invalid identifier
Elapsed: 00:00:00.00
… der sollte einmal ein Tabellen-Alias verwenden. Ohne diesem geht es nämlich nicht:
SQL> select p.attributes.getCLOBVal() from product_xv p; no rows selected Elapsed: 00:00:01.67
Leider gibt es keine RENAME $oldname$ TO $newname$ für Stored-Procedures in Oracle. Dafür kann man folgendes kleines SQL-Skript benutzen:
DECLARE txt VARCHAR2(4000); BEGIN SELECT dbms_metadata.get_ddl('&&type', UPPER('&&old')) INTO txt FROM dual; txt := REPLACE(txt, '&&old', '&&new'); txt := REPLACE(txt, UPPER('&&old'), '&&new'); EXECUTE IMMEDIATE txt; EXECUTE IMMEDIATE 'DROP '||&&type||' '||&&old; END; / show errors;
Allerdings darf diese Store-Procedure nicht größer als 4000 Zeichen sein. Sonst müßte man mit CLOBs arbeiten.
Falls jemand eine passende IDE für das Entwickeln mit Ruby (on Rails) sucht, ich empfehle: Aptana RadRails. Wenn man aus der Java-Entwicklung kommt, ist es ein leichtes, mit dieser auf Eclipse basierenden IDE umzugehen. Auch wenn das Command-Line-Interface von Ruby on Rails sehr mächtig ist, diese IDE schafft es, die möglichen Befehle intuitiver zu entdecken. Mit den entsprechenden Shortcuts ist man mindestens genauso schnell beim Entwickeln, wie mit dem 10-Finger-Tipp-System.
Ein kleines Beispiel -> Test-Driven-Development: Im Editor ist ein Unit-Test geöffnet. Man ändert eine Test-Methode. Mit einem einfachen Strg-F11 kann man diesen Test immer wieder starten.
Die meisten Tutorials bezüglich dem Einsatz von JRuby beschreiben nur, wie man JRuby-Skripte allein aufruft oder wie man innerhalb eines JRuby-Skriptes auf Java-Klassen zugreifen kann. Mir fehlte bisher wie man mittels der Scripting API von Java 6 JRuby aufruft.
Folgendes muss man machen, damit man generisch ein Ruby-Skript innerhalb von Java ausführen kann:
- Installation von Java 6
- Installation von JRuby
- Download der Script-Engines
- Anlegen eines Beispiel-Projektes
- Im lib-Verzeichnis alle JRuby-Jars und die JRuby-Engine aus der Zip-Datei
jsr223-engines.zipkopieren - Test-Programm schreiben:
import java.util.List; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; public class ShowScriptEngines { public static void main(String[] args) { ScriptEngineManager scriptManager = new ScriptEngineManager(); List<ScriptEngineFactory> factories = scriptManager.getEngineFactories(); for(ScriptEngineFactory factory : factories) { System.out.println( factory.getEngineName()+" " +factory.getEngineVersion() +"("+factory.getLanguageName()+" " +factory.getLanguageVersion()+")"); ScriptEngine engine = scriptManager.getEngineByName("jruby"); engine.put("params", args); try { engine.eval("print 'Parameters: '"); engine.eval("$params.each{|a| print a}"); } catch(ScriptException ex) { ex.printStackTrace(System.err); } } } }
- In den Classpath alle Jars aus dem lib-Verzeichnis hinzufügen
- Aufruf:
java ShowScriptEngines 1 2 3
Folgender Ausgabe sollte erfolgen:
Mozilla Rhino 1.6 release 2(ECMAScript 1.6)
jruby 1.0(ruby 1.8.4)
Parameters: 123
Wer Scripting mit Ruby innerhalb von ANT mal ausprobieren möchte, hier eine kleine Anleitung:
- Ant installieren
- JRuby installieren
- Folgende Jars aus JRUBY_HOME/lib nach ANT_HOME/lib kopieren:
- asm-2.2.3.jar
- asm-commons-2.2.3.jar
- backport-util-concurrent.jar
- bsf.jar
- jruby.jar
Alternative kann man auch die Jars nach USER_HOME/.ant/lib kopieren. Dadurch muss man nicht immer nach jeder Ant-Installation die optionalen Libaries nachziehen. Mit folgenden Skript kann man die Installation testen (build.xml):
<project name="test-ruby" default="test"> <property name="message" value="Hello world"/> <target name="test"> <script language="ruby"> print 'message is ',$message, "\n" </script> </target> </project>
Nur mal so eingeschoben….
Falls jemand zufällig ein XML-File parsen und dafür JAXB1 in der aktuellen Release von Java 6 benutzen möchte, sollte nicht wie ich mehrere Stunden sämtliche Tutorials im Netz durchforsten und ausprobieren, sondern gleich JAXB 2.1 installieren. Der Aufruf von:
JAXBContext jc = JAXBContext.newInstance("generated"); Unmarshaller unmarshaller = jc.createUnmarshaller(); unmarshaller.setProperty("com.sun.xml.bind.ObjectFactory", new MyCustomObjectFactory());
erzeugt nämlich eine saftige Exception: javax.xml.bind.PropertyException.
Siehe Bug Jaxb 327
- Java Architecture for XML Binding [↩]
Oracle kann DML-Operationen parallelisieren. Das funktioniert bei UPDATE und DELETE-Anweisungen nur, wenn die entsprechende Tabelle partitioniert ist. Einfache INSERT-Anweisungen können nicht parallelisiert werden. Nur “INSERT INTO tab SELECT * FROM tab2“-Anweisungen können auch ohne Partitionierung parallelisiert werden. Folgendes Beispiel zeigt das empfohlene Vorgehen:
ALTER SESSION ENABLE PARALLEL DML; INSERT /*+ PARALLEL (emp_big,4,1) */ INTO emp_big SELECT * FROM emp; COMMIT; ALTER SESSION DISABLE PARALLEL DML;
Allerdings hat die Parallelisierung einen Nachteil. Leider erfordert die Aufspaltung in mehrere Worker-Threads einen gewissen Overhead, so dass man nicht immer mit dem PARALLEL-Hint schneller ist. Weiterhin funktionieren Parallel-Hints nur mit einer Enterprise Edition von Oracle.
Lang ist her, dass ich mich sehr intensiv mit Linux beschäftigt habe. Seit meinem Studium fehlt mir einfach die Zeit, die ewige Treibersuche, Grafikkartenkonfiguraiton, etc. durchzuführen. In der Regel ist es ja so, dass man eine relativ neue Hardware hat und man noch warten muss, bis Linux alle vorhanden Komponenten unterstützt. Nun ist es endlich so weit. “SuSE Linux 10.2″ ist die Distribution meiner Wahl, die alle Komponenten meines Laptops direkt während der Installation erkannt und ohne murren korrekt konfiguriert hat. So macht Linux Spaß.
Weiterhin finde ich das “Start”-Menü hervorragend entworfen. Selten ein Linux gehabt, dass sich auch noch gut anfühlt.