PL/JavaPL/Java являє собою безкоштовний додатковий модуль, який представила Java™ для написання збережених процедур, тригерів і функцій на внутрішньому інтерфейсі PostgreSQL™. Розробка почалася в кінці 2003 і перший випуск PL/Java випущений в січні 2005 року під ліцензією PLJava. Властивості PL/Java
Написання функцій на PL/JavaSQL ОголошенняФункція 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 + "\""; } Використання JDBCPL/Java містить драйвер JDBC, який зіставляє функції PostgreSQL SPI. З'єднання, що переводить до поточної транзакції може бути отримане за допомогою наступного оператора: Connection conn = DriverManager.getConnection("jdbc:default:connection"); Після отримання сполуки, ви можете підготувати і виконувати інструкції, подібні іншим JDBC з'єднанням. Обмеження для драйвера PL/Java JDBC:
Примітки
|
Portal di Ensiklopedia Dunia