Функции Oracle PL/SQL
Функция — это подпрограмма, которая вычисляет значение.
В этом учебном пособии вы узнаете, как создавать и удалять функции в Oracle/PLSQL с синтаксисом и примерами.
СОЗДАТЬ ФУНКЦИЮ (CREATE FUNCTION)
Как и на других языках программирования, вы можете создавать свои собственные функции в Oracle.
Синтаксис:
CREATE [OR REPLACE] FUNCTION имя_функции
[ (параметр [, параметр, . ]) ]
RETURN тип_данных IS | AS
[локальные объявления]
BEGIN
исполняемые предложения
[EXCEPTION
обработчики исключений]
END [имя_функции];
При создании процедуры или функции, вы можете определить три типа параметров, которые могут быть объявлены:
IN — Параметр может ссылаться на процедуру или функцию. Значение параметра не может быть изменено процедурой или функцией.
OUT — параметр не может ссылаться на процедуру или функцию, но значение параметра может быть изменено процедурой или функцией.
IN OUT — Параметр может ссылаться на процедуру или функцию и значения параметра может быть изменено процедурой или функцией.
Пример
Рассмотрим на примере, как создать функцию в Oracle.
PL / SQL — Функции
В этой главе мы обсудим функции в PL / SQL. Функция такая же, как процедура, за исключением того, что она возвращает значение. Поэтому все обсуждения предыдущей главы верны и для функций.
Создание функции
Автономная функция создается с помощью оператора CREATE FUNCTION . Упрощенный синтаксис для оператора CREATE OR REPLACE PROCEDURE выглядит следующим образом:
CREATE [OR REPLACE] FUNCTION function_name [(parameter_name [IN | OUT | IN OUT] type [, . ])] RETURN return_datatype BEGIN < function_body >END [function_name];
- имя-функции указывает имя функции.
- Опция [ИЛИ ЗАМЕНА] позволяет модифицировать существующую функцию.
- Список необязательных параметров содержит имя, режим и типы параметров. IN представляет значение, которое будет передано извне, а OUT представляет параметр, который будет использоваться для возврата значения вне процедуры.
- Функция должна содержать инструкцию возврата .
- Предложение RETURN указывает тип данных, который вы собираетесь вернуть из функции.
- Функция body содержит исполняемую часть.
- Ключевое слово AS используется вместо ключевого слова IS для создания отдельной функции.
имя-функции указывает имя функции.
Опция [ИЛИ ЗАМЕНА] позволяет модифицировать существующую функцию.
Список необязательных параметров содержит имя, режим и типы параметров. IN представляет значение, которое будет передано извне, а OUT представляет параметр, который будет использоваться для возврата значения вне процедуры.
Функция должна содержать инструкцию возврата .
Предложение RETURN указывает тип данных, который вы собираетесь вернуть из функции.
Функция body содержит исполняемую часть.
Ключевое слово AS используется вместо ключевого слова IS для создания отдельной функции.
пример
В следующем примере показано, как создать и вызвать автономную функцию. Эта функция возвращает общее количество ЗАКАЗЧИКОВ в таблице клиентов.
Мы будем использовать таблицу CUSTOMERS, которую мы создали в главе « Переменные PL / SQL» —
Select * from customers; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ramesh | 32 | Ahmedabad | 2000.00 | | 2 | Khilan | 25 | Delhi | 1500.00 | | 3 | kaushik | 23 | Kota | 2000.00 | | 4 | Chaitali | 25 | Mumbai | 6500.00 | | 5 | Hardik | 27 | Bhopal | 8500.00 | | 6 | Komal | 22 | MP | 4500.00 | +----+----------+-----+-----------+----------+
CREATE OR REPLACE FUNCTION totalCustomers RETURN number IS total number(2) := 0; BEGIN SELECT count(*) into total FROM customers; RETURN total; END; /
Когда приведенный выше код выполняется с использованием подсказки SQL, он даст следующий результат:
Function created.
Вызов функции
При создании функции вы даете определение того, что должна делать функция. Чтобы использовать функцию, вам нужно будет вызвать эту функцию для выполнения определенной задачи. Когда программа вызывает функцию, управление программой передается вызываемой функции.
Вызываемая функция выполняет определенную задачу, и когда выполняется оператор return или когда достигнут последний оператор end , она возвращает управление программой обратно в основную программу.
Чтобы вызвать функцию, вам просто нужно передать необходимые параметры вместе с именем функции, и если функция возвращает значение, вы можете сохранить возвращенное значение. Следующая программа вызывает функцию totalCustomers из анонимного блока —
DECLARE c number(2); BEGIN c := totalCustomers(); dbms_output.put_line('Total no. of Customers: ' || c); END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Total no. of Customers: 6 PL/SQL procedure successfully completed.
пример
В следующем примере демонстрируются объявление, определение и вызов простой функции PL / SQL, которая вычисляет и возвращает максимум два значения.
DECLARE a number; b number; c number; FUNCTION findMax(x IN number, y IN number) RETURN number IS z number; BEGIN IF x > y THEN z:= x; ELSE Z:= y; END IF; RETURN z; END; BEGIN a:= 23; b:= 45; c := findMax(a, b); dbms_output.put_line(' Maximum of (23,45): ' || c); END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Maximum of (23,45): 45 PL/SQL procedure successfully completed.
PL / SQL рекурсивные функции
Мы видели, что программа или подпрограмма может вызывать другую подпрограмму. Когда подпрограмма вызывает себя, она называется рекурсивным вызовом, а процесс называется рекурсией .
Чтобы проиллюстрировать концепцию, давайте вычислим факториал числа. Факториал числа n определяется как —
n! = n*(n-1)! = n*(n-1)*(n-2)! . = n*(n-1)*(n-2)*(n-3). 1
Следующая программа вычисляет факториал данного числа, вызывая себя рекурсивно —
DECLARE num number; factorial number; FUNCTION fact(x number) RETURN number IS f number; BEGIN IF x=0 THEN f := 1; ELSE f := x * fact(x-1); END IF; RETURN f; END; BEGIN num:= 6; factorial := fact(num); dbms_output.put_line(' Factorial '|| num || ' is ' || factorial); END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат —
Вызов внутренней функции
В определенной процедуре в пакете есть внутренняя функция описанная в declare разделe этой процедуры. Есть какая-либо возможность вызвать эту функцию извне, или она может быть вызвана только этой процедурой?
Отслеживать
51.6k 204 204 золотых знака 67 67 серебряных знаков 251 251 бронзовый знак
задан 25 сен 2018 в 6:15
Анатолий Эрнст Анатолий Эрнст
927 1 1 золотой знак 8 8 серебряных знаков 28 28 бронзовых знаков
Нет, только внутри процедуры. Как, собственно, почти везде.
25 сен 2018 в 6:20
А не подскажете, для чего обычно используют вложение функций и процедур? Чтобы защитить их от внешних вызовов или есть еще какие — то особенности? В плане практики применения можно что — то почитать )) ?
25 сен 2018 в 9:22
Чтобы защитить от внешнего вызова в пакете, достаточно не объявлять функцию в интерфейсной части. Обычно все прозаичнее — есть кусок кода, который повторяется, но нужен только внутри одной функции. Можно прямо внутри нее и объявить, чтобы пространство имен не занимать почем зря.
25 сен 2018 в 9:25
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Нет, вызвать извне функцию, объявленную внутри другой функции нельзя. Поиск подпрограммы для вызова производится начиная с текущего пространства имён и продолжается, если не найдена, последовательно в пространствах имён уровнем выше.
См. How PL/SQL Compiler Resolves Invocations в документации.
Это вполне нормально, объявить функцию только в том пространстве имён, где она впервые применяется (в пакетной процедуре, как в данном случае), и тем самым ограничить её область видимости и избежать возможных конфликтов имён.
Если надо вызвать функцию также в программном блоке где она пока не видна и избежать тем самым дупликатов кода, то необходим рефакторинг кода. Переместите функцию в пространство имен, где она будет доступна для вызова из нового и старого кода, возможно переименуйте её.
create or replace package pkg as function foo (arg number) return number; end pkg; / create or replace package body pkg as function bar (arg number) return number is factor constant number := 10; begin return arg * factor; end; function foo (arg number) return number is /** original bar was moved to the package scope */ function bar (arg number) return number is begin return pkg.bar (arg); end; begin return foo.bar (arg); end; end pkg; /
вызов функции
Вызов функции
Как вызвать функцию, которая находится в пакете? причем у нее есть параметры. Пока получается.
Вызов функции
Привет Всем) Туплю насчет вызова следующей функции create or replace function best_func (week_in.
Вызов функции
Подскажите, у меня есть такой запрос где используется функция в блоке where. Как мне написать.
вызов функции из строки запроса
Здравствуйте! Вопрос по вызову функции из строки запроса. Есть таблица SUMS с полями ID (NUMBER) и.
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
Сообщение от blvckvtvnv
Почему я не могу вызвать функцию таким образом?
Как минимум, в SQL нельзя использовать именованное присвоение параметров, только позиционное (в PL/SQL можно).
Регистрация: 16.10.2018
Сообщений: 16
это Pl/sql вроде как)
Регистрация: 21.05.2013
Сообщений: 408
Я вообще первый раз вижу такую конструкцию.
А зачем так усложнять по проще то нельзя?
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
Сообщение от blvckvtvnv
это Pl/sql вроде как
У тебя функция вызывается в SELECT, значит в контексте SQL
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
Сообщение было отмечено blvckvtvnv как решение
Решение
Сообщение от blvckvtvnv
Почему я не могу вызвать функцию таким образом?
1) У вас функция скалярная (возвращает ОДНО значение) следовательно к ней нельзя обратиться как к таблице (сделать из неё селект. Чтобы работал именно ваш способ вызова — необходима пайплайн функция (pipelined), которая возвращает таблицу значений — что это такое — читайте документацию.
2) Если вы хотите вызвать вашу функцию в селекте — то это можно сделать, но другим способом
SELECT sql4sst_cntr_eq_excel(11,'27.01.2019 21:00','28.01.2019 21:00') FROM dual
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Вызов функции через select
Здравствуйте, написал функцию и пытаюсь вызвать её через select. При этом появляется ошибка.
Вызов функции из пакета возвращает ошибку «xxx is not a procedure or is undefined»
Доброго времени суток. Создаю пакет, в нем объявляю одну единственную функцию. Create or Replace.
Вызов процедуры из функции
Доброе время суток! Есть функция которая возвращает значение ID и если артикул не найден данные.
Новичек. Вызов функции
Добрый вечер! В access — чайник. Помогите с вопросом (думаю, простым..) Выполняю VBA код в.
Вызов функции в запросе
Нужно вставить в таблицу сгенерированный uuid. Вставить надо так INSERT INTO T1 SELECT.
Повторный вызов функции
Здравствуйте, помогите пожалуйста с проблемой. Существует пользовательская функция, внутри которой.
Или воспользуйтесь поиском по форуму: