PL/Java являє собою безкоштовний додатковий модуль, який представила Java™ для написання збережених процедур, тригерів і функцій на внутрішньому інтерфейсі PostgreSQL™. Розробка почалася в кінці 2003 і перший випуск PL/Java випущений в січні 2005 року під ліцензією PLJava.

Властивості PL/Java ред.

  • Уміння писати функції, тригери, визначені користувачем типи, … з використанням останніх версій Java.
  • Стандартизовані утіліти, щоб встановити і підтримувати Java-код в базі даних.
  • Стандартизовані відображення параметрів і результату. Підтримка скалярних і складових типів, визначених користувачем (UDT), псевдо типи, масиви і набори.
  • Вбудований, високопродуктивний драйвер JDBC, який використовує внутрішні процедури PostgreSQL SPI.
  • Підтримка метаданих для драйвера JDBC. Обидві DatabaseMetaData і ResultSetMetaData включені.
  • Інтеграція з PostgreSQL.
  • Можливість використовувати параметри IN, INOUT і OUT.[1]

Написання функцій на PL/Java ред.

SQL Оголошення ред.

Функція Java оголошується з ім'ям класу і статичним методом з цього класу. Клас буде вирішений за допомогою шляху до класів, який був визначений для схеми, де функція оголошена. Якщо шляху до класів не було визначено для цієї схеми, використовується загальна схема.

Наступна функція може бути оголошена для доступу статичного до методу GetProperty в класі java.lang.System:

 CREATE FUNCTION getsysprop(VARCHAR)
   RETURNS VARCHAR
   AS 'java.lang.System.getProperty'
   LANGUAGE java;

Виконайте наступну команду, щоб повернути властивість Java user.home:

 SELECT getsysprop('user.home');

NULL Обробка ред.

Скалярні типи, які зіставляються в Java примітивах не можуть приймати як значення NULL. Щоб передати NULL значення, ці типи можуть мати альтернативне відображення. Ви включаєте це відображення явно позначивши його як еталонний метод.

 CREATE FUNCTION trueIfEvenOrNull(integer)
   RETURNS bool
   AS 'foo.fee.Fum.trueIfEvenOrNull(java.lang.Integer)'
   LANGUAGE java;

Код Java буде схожий на це:

 package foo.fee;
 public class Fum
 {
   static boolean trueIfEvenOrNull(Integer value)
   {
     return (value == null)
       ? true
       : (value.intValue() % 1) == 0;
   }
 }

Наступні твердження обидва дають значення true:

 SELECT trueIfEvenOrNull(NULL);
 SELECT trueIfEvenOrNull(4);

Для того, щоб повернути NULL значення з методу Java, ви використовуєте тип об'єкта, який відповідає примітиву (наприклад, ви повертаєте java.lang.Integer замість int). Оскільки Java не може мати різні типи для методів з тим же ім'ям, це не вносить будь-яких двозначностей.

Комплексні типи ред.

Комплексний тип завжди буде передаватися для читання java.sql.ResultSet рівно з одного рядка. ResultSet розташований на цьому рядку, тому виклик до next() не буде зроблено. Значення комплексного типу витягуються за допомогою стандартних методів отримання ResultSet.

Приклад:

 CREATE TYPE complexTest
   AS(base integer, incbase integer, ctime timestamptz);
 CREATE FUNCTION useComplexTest(complexTest)
   RETURNS VARCHAR
   AS 'foo.fee.Fum.useComplexTest'
   IMMUTABLE LANGUAGE java;

У класі Fum Java, ми додамо наступний статичний метод:

 public static String useComplexTest(ResultSet complexTest)
 throws SQLException
 {
   int base = complexTest.getInt(1);
   int incbase = complexTest.getInt(2);
   Timestamp ctime = complexTest.getTimestamp(3);
   return "Base = \"" + base +
     "\", incbase = \"" + incbase +
     "\", ctime = \"" + ctime + "\"";
 }

Використання JDBC ред.

PL/Java містить драйвер JDBC, який зіставляє функції PostgreSQL SPI. З'єднання, що переводить до поточної транзакції може бути отримане за допомогою наступного оператора:

 Connection conn = 
   DriverManager.getConnection("jdbc:default:connection");

Після отримання сполуки, ви можете підготувати і виконувати інструкції, подібні іншим JDBC з'єднанням.

Обмеження для драйвера PL/Java JDBC:

  • Транзакція не може управлятися будь-яким чином. Таким чином, ви не можете використовувати методи з'єднання, такі як:
    • commit()
    • rollback()
    • setAutoCommit()
    • setTransactionIsolation()
  • Точки збереження доступні з деякими обмеженнями. Точка збереження не може пережити функцію, в якій вона була встановлена.
  • Результуючий набір з ExecuteQuery() завжди FETCH_FORWARD і CONCUR_READ_ONLY.
  • Мета-дані доступні тільки в PL/Java 1.1 або вище.
  • CallableStatement (для збережених процедур) не виконується.[2]

Примітки ред.

  1. tada/pljava. GitHub (англ.). Архів оригіналу за 26 січня 2018. Процитовано 22 травня 2017.
  2. Greenplum PL/Java Language Extension | Greenplum Database Docs. greenplum.org. Архів оригіналу за 1 травня 2017. Процитовано 22 травня 2017.