Передача переменных в запрос из внешних систем

Передача переменных в SQL-запросы из внешних систем обычно происходит через параметры, которые могут быть динамически подставлены в запросы при их выполнении. Это может быть реализовано различными способами в зависимости от используемой системы управления базами данных (СУБД) и внешней системы (например, приложения, скрипта или среды разработки).

Общие методы передачи переменных

  1. Параметризованные запросы: Внешняя система передает значения в SQL-запросы как параметры. Это подходит для предотвращения SQL-инъекций и упрощает управление значениями.

  2. Подстановочные переменные: Переменные подставляются непосредственно в текст запроса. Это чаще всего используется в тестировании или в скриптах.

  3. Хранимые процедуры и функции: Переменные передаются в хранимые процедуры и функции, которые затем выполняют запросы с этими переменными.

Примеры для различных систем

SQL Server (T-SQL)

В SQL Server вы можете использовать параметризованные запросы или хранимые процедуры.

Параметризованный запрос

В .NET (C#) или другом языке программирования:

string query = "SELECT * FROM employees WHERE salary > @MinSalary";
using (SqlCommand cmd = new SqlCommand(query, connection))
{
    cmd.Parameters.AddWithValue("@MinSalary", 50000);
    SqlDataReader reader = cmd.ExecuteReader();
    // Обработка результатов
}

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

CREATE PROCEDURE GetEmployeesAboveSalary
    @MinSalary DECIMAL(10, 2)
AS
BEGIN
    SELECT employee_id, name, salary
    FROM employees
    WHERE salary > @MinSalary;
END;

Вызов из .NET:

using (SqlCommand cmd = new SqlCommand("GetEmployeesAboveSalary", connection))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@MinSalary", 50000);
    SqlDataReader reader = cmd.ExecuteReader();
    // Обработка результатов
}

MySQL

В MySQL можно использовать подготовленные выражения и пользовательские функции.

Подготовленное выражение

В PHP:

$stmt = $mysqli->prepare("SELECT * FROM employees WHERE salary > ?");
$stmt->bind_param("d", $minSalary);
$minSalary = 50000;
$stmt->execute();
$result = $stmt->get_result();
// Обработка результатов

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

CREATE PROCEDURE GetEmployeesAboveSalary(IN minSalary DECIMAL(10, 2))
BEGIN
    SELECT employee_id, name, salary
    FROM employees
    WHERE salary > minSalary;
END;

Вызов из PHP:

$stmt = $mysqli->prepare("CALL GetEmployeesAboveSalary(?)");
$stmt->bind_param("d", $minSalary);
$minSalary = 50000;
$stmt->execute();
$result = $stmt->get_result();
// Обработка результатов

PostgreSQL

В PostgreSQL можно использовать параметризованные запросы и функции.

Параметризованный запрос

В Python (с использованием библиотеки psycopg2):

query = "SELECT * FROM employees WHERE salary > %s"
cursor.execute(query, (50000,))
rows = cursor.fetchall()
# Обработка результатов

Функция

CREATE OR REPLACE FUNCTION GetEmployeesAboveSalary(minSalary DECIMAL)
RETURNS TABLE(employee_id INT, name TEXT, salary DECIMAL) AS $$
BEGIN
    RETURN QUERY
    SELECT employee_id, name, salary
    FROM employees
    WHERE salary > minSalary;
END;
$$ LANGUAGE plpgsql;

Вызов функции:

query = "SELECT * FROM GetEmployeesAboveSalary(%s)"
cursor.execute(query, (50000,))
rows = cursor.fetchall()
# Обработка результатов

Oracle

В Oracle можно использовать параметризованные запросы и PL/SQL процедуры.

Параметризованный запрос

В Java (с использованием JDBC):

String query = "SELECT * FROM employees WHERE salary > ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setBigDecimal(1, new BigDecimal("50000"));
ResultSet rs = pstmt.executeQuery();
// Обработка результатов

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

CREATE OR REPLACE PROCEDURE GetEmployeesAboveSalary(minSalary NUMBER)
IS
BEGIN
    FOR rec IN (SELECT employee_id, name, salary
                FROM employees
                WHERE salary > minSalary) LOOP
        DBMS_OUTPUT.PUT_LINE(rec.employee_id || ' ' || rec.name || ' ' || rec.salary);
    END LOOP;
END;

Вызов процедуры из Java:

CallableStatement cstmt = connection.prepareCall("{call GetEmployeesAboveSalary(?)}");
cstmt.setBigDecimal(1, new BigDecimal("50000"));
cstmt.execute();
// Обработка результатов, если применимо

Заключение

Передача переменных в запросы из внешних систем может быть выполнена различными способами в зависимости от используемой СУБД и языка программирования. Основные подходы включают использование параметризованных запросов, хранимых процедур, пользовательских функций и подготовленных выражений. Эти методы помогают обеспечить безопасность запросов, предотвратить SQL-инъекции и улучшить управляемость кода.

Last updated