Перейти к содержанию

Хранимые процедуры

Использование хранимых процедур

Создание процедуры на узле Tarantool

function insert_person(id)
    return crud.insert('person', {id, true, 'hello'})
end
box.schema.func.create('insert_person')

function echo(in_value)
    return in_value
end
box.schema.func.create('echo')

Space person имеет следующий формат данных:

format = {
    { 'id', type = 'number' },
    { 'is_married', type = 'boolean', is_nullable = true },
    { 'name', type = 'string' },
    { 'bucket_id', 'unsigned' },
}

Вызов хранимых процедур

Для того чтобы вызвать хранимую процедуру, воспользуйтесь TarantoolClient API:

// ... создание клиента TarantoolCrudClient

final List<?> data = crudClient.call("insert_person", Arrays.asList(1)).join().get();

Хранимая процедура insert_person принимает один аргумент id. В процедуре выполняется вставка записи с идентификатором id. Метод crud.insert(...) возвращает Go-like кортеж result, err, где

// структура
result : {  
    rows: array<array<object>>,
    metadata: map<string, object>
}

// структура
err: {
    line: string,
    class_name: string,
    err: string,
    file: string,
    str: string
}

При первом вызове хранимой функции Java-клиент вернет следующий результат запроса:

data = [
    {
        rows=[
            Tuple(formatId = 55, data = [1, false, hello, 477], format = [])
        ], 
        metadata=[
            {name=id, type=number}, 
            {type=boolean, name=is_married, is_nullable=true}, 
            {name=name, type=string}, 
            {name=bucket_id, type=unsigned}
        ]
    }, // result
    null // error
]

При повторном вызове из-за дублирования идентификатора метод crud.insert(...) выдаст ошибку:

data = [
    null, // result
    { // error
        line=120, 
        class_name=InsertError, 

        err=Failed to insert: Duplicate key exists in unique index "pk" in space "person" with old \
        tuple - [1, false, "hello", 477] and new tuple - [1, false, "hello", 477],

        file=/app/.rocks/share/tarantool/crud/insert.lua,

        str=InsertError: Failed to insert: Duplicate key exists in unique index "pk" in space \
        "person" with old tuple - [1, false, "hello", 477] and new tuple - [1, false, "hello", 477]
    }
]
// ... создание клиента TarantoolBoxClient
// Вызов хранимой процедуры с входным аргументом типа int
final List<?> data = crudClient.call("echo", Arrays.asList(1)).join().get();

// Вызов хранимой процедуры с входным аргументом типа String 
final List<?> data = crudClient.call("echo", Arrays.asList("hello")).join().get();

// Вызов хранимой процедуры с входным аргументом типа boolean
final List<?> data = crudClient.call("echo", Arrays.asList(true)).join().get();

Хранимая процедура echo принимает один аргумент in_value. В процедуре выполняется возврат входного аргумента. При вызове хранимой функции Java-клиент вернет следующий результат запроса:

// Результат crudClient.call("echo", Arrays.asList(1)).join().get();
data = [1] // массив из одного int

// Результат crudClient.call("echo", Arrays.asList("hello")).join().get();
data = ["hello"] // массив из одного элемента типа String

// Результат crudClient.call("echo", Arrays.asList(true)).join().get();
data = [true] // массив из одного жлемента типа boolean

Хранимые процедуры могут принимать 0 или более входных и выходных аргументов. Преобразование Java-типов в типы Tarantool производится с помощью Jackson сериализаторов/десериализаторов (подробнее). Для того чтобы задать пользовательские преобразования типов, обратитесь к документации Jackson.