18 июн. 2012 г.

Oracle stored procedure on Pascal!

Всем хорошо известно, что хранимые процедуры для Oracle Database можно разрабатывать только на двух языках программирования PL/SQL и Java.

Однако ничего не мешает использовать для разработки хранимых процедур любой язык программирования, компилятор которого на выходе может генерировать байт-код виртуальной машины Java. Далее полученный class-файл или jar-файл, можно загрузить в Oracle Database Java VM и вызывать внутри базы данных !

Рассмотрим для примера компилятор языка программирования Pascal Oxygene for Java компании RemObjects. Этот компилятор транслирует исходный код на Object Pascal в байт-код виртуальной машины Java.
Кстати говоря, эта компания имеет в своем арсенале также аналогичный компилятор Oxygene for .Net, который транслирует исходник на Pascal в код исполняющей системы .Net. Этот компилятор лицензирован компанией Embarcadero и входит в состав среды разработки Delphi под названием Delphi Prism.







Итак, предположим, что у нас имеется вот такой простейший класс на Object Pascal:
namespace testPascalSP;

interface

type
  TMyClass = class
  public
    class function getHello :  String;
  end;

implementation

uses
  java.sql.*;

  class function TMyClass.getHello : String;
  begin
    var conn := DriverManager.getConnection('jdbc:default:connection:');
    var stmt := conn.createStatement();  

    var rset := stmt.executeQuery('select ''Hello World!'' from dual');

    if rset.next() then
      Result := rset.getString (1);

    rset.close();
    stmt.close();
  end;

end.
Класс TMyClass имеет одну статическую функцию getHello, которая возвращает традиционное приветствие, "извлекая" его из таблицы DUAL.
Обратите внимание, что в программе на Pascal-е используются Jаva-библиотеки (JDBC-драйвер)!

Компилятор Oxygene for Java существует в двух видах: в виде графической среды разработки которая встраивается в среду MS Visual Studio и в виде утилиты командной строки.

Компилируем исходник на Pascal-е c помощью компилятора командной строки:
C:\>Oxygene.exe testPascalSP.oxygene
RemObjects Oxygene for .NET - Version 5.2.36.1029 (BETA)
Copyright RemObjects Software 2003-2012. All rights reserved.

Source file: C:\PascalSP>Program.pas
Reference: C:\Program Files (x86)\Java\jre6\lib\rt.jar

Compilation successful, generated file ".\bin\Release\testPascalSP.jar"
Пусть вас не смущает вывод названия RemObjects Oxygene for .NET. На самом деле для .Net и Java компилятор общий, и включает в себя back-end и для .Net, и Java. С помощью опций проекта в файле test1.oxygene целевая платформа может переключаться.
Далее полученный jar-файл загружаем в СУБД:
C:\>loadjava -user scott/tiger@orcl -resolve testpascalsp.jar
Осталось создать PL/SQL-оболочку для вызова статического метода Java-класса:
C:\>sqlplus scott/tiger@orcl

SQL*Plus: Release 11.2.0.3.0 Production on Mon Jun 18 20:05:54 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create or replace function getHello return varchar2 is
  2     language java
  3       name 'testpascalsp.TMyClass.getHello() return java.lang.String';
  4  /

Function created.

SQL>
Теперь можно вызывать нашу хранимую процедуру на Pascal внутри СУБД!
SQL> exec dbms_output.put_line(getHello());
Hello World!

PL/SQL procedure successfully completed.
Какие преимущества дает использование другого языка программирования, в данном случае Object Pascal, для разработки хранимых процедур СУБД: Также back-end для JavaVM имеет другой известный компилятор языка Pascal- FreePascal.