Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применяется к:
Databricks SQL Databricks Runtime 17.0 и выше
Unity Catalog
Создает процедуру в каталоге Unity, которая принимает или изменяет аргументы, выполняет набор инструкций SQL и при необходимости возвращает результирующий набор.
Синтаксис
CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]
procedure_name ( [ procedure_parameter [, ...] ] )
[ characteristic [...] ]
AS compound_statement
procedure_parameter
[ IN | OUT | INOUT ] parameter_name data_type
[ DEFAULT default_expression ] [ COMMENT parameter_comment ]
characteristic
{ LANGUAGE SQL |
SQL SECURITY { INVOKER | DEFINER } |
NOT DETERMINISTIC |
COMMENT procedure_comment |
DEFAULT COLLATION default_collation_name |
MODIFIES SQL DATA }
Параметры
ИЛИ ЗАМЕНИТЬ
Если указано, процедура с тем же именем заменяется. Невозможно заменить существующую функцию процедурой; это вызывает ROUTINE_ALREADY_EXISTS. Этот параметр нельзя указать;
IF NOT EXISTSпри указании обоих вызовов INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.ЕСЛИ НЕ СУЩЕСТВУЕТ
Если задано, создает процедуру только в том случае, если процедура с этим именем еще не существует. Если процедура с тем же именем существует, инструкция игнорируется. Этот параметр нельзя указать;
OR REPLACEпри указании обоих вызовов INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.-
Название для процедуры. При желании можно уточнить имя процедуры, добавив имя схемы. Если имя не квалифицировано, постоянная процедура создается в текущей схеме.
Имя процедуры должно быть уникальным для всех подпрограмм (процедур и функций) в схеме. Если подпрограмма с тем же именем существует и не
OR REPLACEIF NOT EXISTSуказана, Azure Databricks вызывает ROUTINE_ALREADY_EXISTS. procedure_parameter
Задает параметр процедуры.
-
Имя параметра должно быть уникальным в рамках процедуры; в противном случае Azure Databricks вызывает DUPLICATE_ROUTINE_PARAMETER_NAMES.
IN, INOUT или OUT
При необходимости описывается режим параметра.
В
Определяет только входной параметр. Это значение по умолчанию.
INOUT
Определяет параметр, принимаюющий аргумент входных выходных данных. Если процедура завершается без необработанных ошибок, она вернет окончательное значение параметра в виде выходных данных.
ВНЕ
Определяет выходной параметр. Параметр инициализируется
NULLи, если процедура завершается без необработанных ошибок, она вернет окончательное значение параметра в виде выходных данных.
-
Любой поддерживаемый тип данных.
ПО УМОЛЧАНИЮ default_expression
Необязательное значение по умолчанию, используемое, когда при вызове функции параметру не присваивается аргумент.
default_expressionдолжен приводиться кdata_type. Выражение не должно ссылаться на другой параметр или содержать подзапрос.При указании по умолчанию для одного параметра все следующие параметры также должны иметь значение по умолчанию.
DEFAULTне поддерживается дляOUTилиINOUTпараметров; при указании одного вызывается PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.Комментарий COMMENT
Необязательное описание параметра.
commentдолжен быть литеральным значениемSTRING.
-
-
Составная инструкция SQL (
BEGIN ... END) с определением процедуры SQL.При создании процедуры проверяется синтаксическая правильность. Тело процедуры не проверяется на семантическую корректность, пока не будет вызвана процедура.
характеристика
Один из
SQL SECURITY INVOKERних илиSQL SECURITY DEFINERLANGUAGE SQLобязательный. Все остальные являются необязательными. Можно указать любое количество характеристик в любом порядке, но можно указать каждое предложение только один раз.ЯЗЫК SQL
Язык реализации функции.
ВЫЗОВ БЕЗОПАСНОСТИ SQL
Указывает, что все инструкции SQL в тексте процедуры будут выполняться под руководством пользователя, вызывающего процедуру.
При разрешении связей и подпрограмм в тексте процедуры Azure Databricks использует текущий каталог и текущую схему во время вызова.
Сведения о том, как авторизованный пользователь и пользователь сеанса ведут себя внутри органов процедур и между вложенными звонками, см. в статье "Авторизованный пользователь и пользователь сеанса ".
ОПРЕДЕЛЕНИЕ БЕЗОПАСНОСТИ SQL
Область применения:
Databricks SQLУказывает, что все инструкции SQL в тексте процедуры всегда выполняются под руководством владельца (определителя) процедуры независимо от того, какой пользователь вызывает процедуру. То есть владелец является авторизованным пользователем для тела. Вызывающий объект требует
EXECUTEтолько привилегии для процедуры. Все проверки доступа по отношениям, подпрограммам и другим объектам, на которые ссылается текст, оцениваются в отношении авторизованного пользователя.При разрешении связей и подпрограмм в тексте процедуры Azure Databricks использует каталог и схему, которые были текущими в момент создания процедуры. Объекты с областью действия сеанса, такие как временные представления, временные таблицы, переменные сеанса и функции области сеанса, исключаются из пути поиска разрешения внутри тела, поэтому они не могут ссылаться на их нечеткие имена. Они остаются доступными при ссылке на
sessionквалификатор схемы, напримерsession.object_nameилиsystem.session.object_name.Конфигурации SQL (например,
ANSI_MODEили часовой пояс по умолчанию), влияющие на семантику инструкций в тексте, также фиксируются во время создания и используются во время каждого вызова процедуры независимо от параметров сеанса вызывающего объекта.В тексте
SQL SECURITY DEFINERcurrent_catalog возвращает каталог, который был текущим при создании процедуры, а current_schema и current_database возвращать схему, которая была текущей при создании процедуры.SQL SECURITY DEFINERне изменяет значение session_user: он продолжает возвращать пользователя, выдавшего егоCALL. Сведения о том, как авторизованный пользователь и пользователь сеанса отличаются внутриSQL SECURITY DEFINERтела.НЕ ДЕТЕРМИНИРОВАННЫЙ
Предполагается, что процедура недетерминирована, то есть она может возвращать разные результаты для каждого вызова, даже если он вызывается с одинаковыми аргументами.
КОММЕНТАРИЙ procedure_comment
Комментарий к процедуре.
procedure_commentдолжен бытьSTRINGлитеральным. Значение по умолчанию —NULL.СОРТИРОВКА ПО УМОЛЧАНИЮ default_collation_name
Применяется к:
Databricks SQL
Databricks Runtime 17.1 и более поздних версийЗадает параметры сортировки по умолчанию процедуры. Параметры сортировки по умолчанию процедуры используются в качестве сортировки по умолчанию для параметров процедуры, выражений для параметров,
DEFAULTтипизированных локальных переменных,STRINGобъявленных в тексте процедуры, иSTRINGлитералов, используемых в тексте процедуры.В Databricks Runtime 17.1–Databricks Runtime 18.2
default_collation_nameдолжен бытьUTF8_BINARY. Это предложение является обязательным, если схема, в которой создается процедура, имеет параметры сортировки по умолчанию, отличные отUTF8_BINARY.Область применения:check помечена да Проверка Databricks SQL
Databricks Runtime 18 и выше 
Note
Databricks Runtime 18 является более новым, чем Databricks Runtime 18.0, 18.1 и 18.2. Функции, которые ранее были отправлены в качестве более поздней нумеровой версии, теперь отправляются как устаревшие обновления в Databricks Runtime 18. Дополнительные сведения см. в разделе "Сведения об унифицированных заметках о выпуске".
default_collation_nameможет быть любым поддерживаемым именем сортировки.Если параметр не указан, параметры сортировки по умолчанию являются производными от схемы, в которой создается процедура.
ИЗМЕНЯЕТ ДАННЫЕ SQL
Предполагается, что процедура изменяет данные SQL.
Распространенные условия ошибки
- DUPLICATE_CLAUSES
- DUPLICATE_ROUTINE_PARAMETER_NAMES
- INVALID_DEFAULT_VALUE
- INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE
- MISSING_CLAUSES_FOR_OPERATION
- PROCEDURE_CREATION_EMPTY_ROUTINE
- PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT
- PROCEDURE_NOT_SUPPORTED
- PROCEDURE_NOT_SUPPORTED_WITH_HMS
- ROUTINE_ALREADY_EXISTS
- НЕПОДДЕРЖИВАЕМАЕ_СРАВНЕНИЕ_ПРОЦЕДУРЫ
Примеры
-- Demonstrate INOUT and OUT parameter usage.
> CREATE OR REPLACE PROCEDURE add(x INT, y INT, OUT sum INT, INOUT total INT)
LANGUAGE SQL
SQL SECURITY INVOKER
COMMENT 'Add two numbers'
AS BEGIN
SET sum = x + y;
SET total = total + sum;
END;
> DECLARE sum INT;
> DECLARE total INT DEFAULT 0;
> CALL add(1, 2, sum, total);
> SELECT sum, total;
3 3
> CALL add(3, 4, sum, total);
7 10
-- The last executed query is the result set of a procedure
> CREATE PROCEDURE greeting(IN mode STRING COMMENT 'informal or formal')
LANGUAGE SQL
SQL SECURITY INVOKER
AS BEGIN
SELECT 'Hello!';
CASE mode WHEN 'informal' THEN SELECT 'Hi!';
WHEN 'formal' THEN SELECT 'Pleased to meet you.';
END CASE;
END;
> CALL greeting('informal');
Hi!
> CALL greeting('formal');
Pleased to meet you.
> CALL greeting('casual');
Hello!
-- Use SQL SECURITY DEFINER so the procedure runs with the owner's privileges
-- and references its creation-time catalog and schema. The invoker only needs
-- EXECUTE on `audit_app.ops.log_event`; they do not need any privileges on the
-- underlying `audit_app.private.audit_log` table.
> USE CATALOG audit_app;
> USE SCHEMA ops;
> CREATE OR REPLACE PROCEDURE log_event(IN event STRING)
LANGUAGE SQL
SQL SECURITY DEFINER
MODIFIES SQL DATA
AS BEGIN
INSERT INTO audit_app.private.audit_log
VALUES (current_user(), current_catalog(), current_schema(), event);
END;
-- Even when invoked from a different catalog/schema and by a different user,
-- the body still inserts into `audit_app.private.audit_log`, with
-- `current_catalog()` and `current_schema()` returning the values frozen at
-- creation time. `session_user()` is unaffected by `SQL SECURITY DEFINER`
-- and records the actual invoker -- which is what audit logs typically want.
> USE CATALOG sales;
> USE SCHEMA reports;
> CALL audit_app.ops.log_event('checkout_completed');