ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ื‘ื ื™ื”ื•ืœ ืžืกื“ื™ ื ืชื•ื ื™ื

ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช: ื›ื™ืฆื“ ื”ืŸ ืคื•ืขืœื•ืช ื•ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘ื”ืŸ ื‘ืฆื•ืจื” ื ื›ื•ื ื”

ื›ืœ ื™ื™ืฉื•ื ืžื•ื ื—ื” ืžืกื“ ื ืชื•ื ื™ื ืžื’ื™ืข ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ ืœื ืงื•ื“ื” ืฉื‘ื” ืฉืื™ืœืชื•ืช SQL ื”ืคื–ื•ืจื•ืช ื‘ืงื•ื“ ื”ื™ื™ืฉื•ื ื”ื•ืคื›ื•ืช ืœื‘ืขื™ื™ืช ืชื—ื–ื•ืงื”. ืื•ืชื• ืฆื™ืจื•ืฃ ืžื•ืจื›ื‘ ืžื•ืคื™ืข ื‘ืฉืœื•ืฉื” ืฉื™ืจื•ืชื™ื ืฉื•ื ื™ื. ืœื•ื’ื™ืงื” ืขืกืงื™ืช ืฉืฉื™ื™ื›ืช ืœืฉื›ื‘ืช ืžืกื“ ื”ื ืชื•ื ื™ื ื“ื•ืœืคืช ืœืชื•ืš ื”ื™ื™ืฉื•ื. ืžื“ื™ื ื™ื•ืช ืื‘ื˜ื—ื” ืฉืืžื•ืจื” ืœื”ื™ื•ืช ื ืื›ืคืช ื‘ืฉื›ื‘ืช ื”ื ืชื•ื ื™ื ื ืื›ืคืช ื‘ืžืงื•ื ื–ืืช ื‘ืื•ืคืŸ ืœื ืขืงื‘ื™ ืขืœ ื™ื“ื™ ืงื•ื“ ื™ื™ืฉื•ื ืฉื ื™ืชืŸ ืœืขืงื•ืฃ. ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืžื˜ืคืœื•ืช ื‘ืกื•ื’ ื–ื” ืฉืœ ื‘ืขื™ื•ืช ืขืœ ื™ื“ื™ ื”ืขื‘ืจืช ืœื•ื’ื™ืงืช SQL ืจื‘ ืคืขืžื™ืช, ืจื’ื™ืฉื” ืœืื‘ื˜ื—ื” ื•ืงืจื™ื˜ื™ืช ืœื‘ื™ืฆื•ืขื™ื ืœืชื•ืš ืžืกื“ ื”ื ืชื•ื ื™ื, ืฉื ื ื™ืชืŸ ืœื ื”ืœ ืื•ืชื”, ืœื”ื’ื“ื™ืจ ื’ืจืกืื•ืช, ืœืื‘ื˜ื— ืื•ืชื” ื•ืœืžื˜ื‘ ืื•ืชื” ื‘ืื•ืคืŸ ืขืฆืžืื™ ืžื”ื™ื™ืฉื•ืžื™ื ืฉืงื•ืจืื™ื ืœื”.

ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ื”ื™ื ืงื‘ื•ืฆื” ื‘ืขืœืช ืฉื ื•ืžื•ืจื›ื‘ืช ืžืจืืฉ ืฉืœ ืžืฉืคื˜ื™ SQL ื”ืžืื•ื—ืกื ื™ื ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ื•ืžื‘ื•ืฆืขื™ื ื›ื™ื—ื™ื“ื”. ื”ื™ื ืžืงื‘ืœืช ืคืจืžื˜ืจื™ื, ืžื›ื™ืœื” ืœื•ื’ื™ืงื” ื•ื™ื›ื•ืœื” ืœื”ื—ื–ื™ืจ ืชื•ืฆืื•ืช, ืคืจืžื˜ืจื™ ืคืœื˜ ืื• ืงื•ื“ื™ ืกื˜ื˜ื•ืก. ื‘ื ื™ื’ื•ื“ ืœืฉืื™ืœืชื•ืช ืื“-ื”ื•ืง ื”ื ืฉืœื—ื•ืช ืขืœ ื™ื“ื™ ืงื•ื“ ื™ื™ืฉื•ื, ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ืขื•ื‘ืจืช ื ื™ืชื•ื— ื•ืžื•ืจื›ื‘ืช ืคืขื ืื—ืช, ืชื•ื›ื ื™ืช ื”ื‘ื™ืฆื•ืข ืฉืœื” ืžืื•ื—ืกื ืช ื‘ืžื˜ืžื•ืŸ ื•ืžืฉืžืฉืช ืฉื•ื‘ ื‘ื›ืœ ืงืจื™ืื” ืขื•ืงื‘ืช, ื•ื‘ื›ืš ืžื‘ื˜ืœืช ืืช ืชืงื•ืจืช ื”ืงื•ืžืคื™ืœืฆื™ื” ืฉ-SQL ื“ื™ื ืžื™ ื—ื•ื–ืจ ื•ื ืฉื ื” ื›ืจื•ืš ื‘ื”. ืžื“ืจื™ืš ื–ื” ืžื›ืกื” ืžื”ืŸ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช, ืžืชื™ ืœื”ืฉืชืžืฉ ื‘ื”ืŸ, ื›ื™ืฆื“ ื”ืŸ ืื•ื›ืคื•ืช ืื‘ื˜ื—ื”, ื›ื™ืฆื“ ื”ืŸ ืžืฉืคื™ืขื•ืช ืขืœ ื”ื‘ื™ืฆื•ืขื™ื ื•ื›ื™ืฆื“ ืœื ื”ืœ ืื•ืชืŸ ื›ืฉื”ืŸ ื’ื“ืœื•ืช ืœืชืœื•ืช ื”ืžืฉืชืจืขื•ืช ืขืœ ืคื ื™ ื›ืœ ืžืื’ืจ ื”ื ืชื•ื ื™ื.

ื”ื™ืงืฃ ื›ืœ ืฉื™ื ื•ื™ ื‘ืžืกื“ ื”ื ืชื•ื ื™ื ืœืคื ื™ ืฉื”ื•ื ืžื•ืคืขืœ

SMART TS XL ืžืžืคื” ืชืœื•ื™ื•ืช ืฉืœ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ื‘ื• ื–ืžื ื™ืช ื‘-SQL, COBOL, Java ื•-Python.

ืžื™ื“ืข ื ื•ืกืฃ

ืชื•ื›ืŸ ื”ืขื ื™ื™ื ื™ื

ืžื”ื™ ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช?

ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ื”ื™ื ืฉื’ืจื” ืฉืขื‘ืจื” ืงื•ืžืคื™ืœืฆื™ื” ืžืจืืฉ, ื”ืžืื•ื—ืกื ืช ื‘ืžืกื“ ื ืชื•ื ื™ื ื™ื—ืกื™ ื•ื ืงืจืืช ื‘ืฉื ืขื ืคืจืžื˜ืจื™ื ืื•ืคืฆื™ื•ื ืœื™ื™ื. ืžื ื•ืข ืžืกื“ ื”ื ืชื•ื ื™ื ืงื•ืžืคื™ืœืจ ืื•ืชื” ืคืขื ืื—ืช, ืžืื—ืกืŸ ื‘ืžื˜ืžื•ืŸ ืืช ืชื•ื›ื ื™ืช ื”ื‘ื™ืฆื•ืข ื•ืžืฉืชืžืฉ ืžื—ื“ืฉ ื‘ืชื•ื›ื ื™ืช ื–ื• ื‘ื›ืœ ืงืจื™ืื” ืขื•ืงื‘ืช, ืชื•ืš ื”ื™ืžื ืขื•ืช ืžืžื—ื–ื•ืจ ื”ื ื™ืชื•ื—-ืงื•ืžืคื™ืœืฆื™ื”-ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืฉืื™ืœืชื•ืช SQL ืื“-ื”ื•ืง ื“ื•ืจืฉื•ืช ื‘ื›ืœ ืคืขื ืฉื”ืŸ ืคื•ืขืœื•ืช.

SQL

-- SQL Server: basic stored procedure
CREATE PROCEDURE GetCustomerOrders
    @CustomerId INT,
    @StartDate  DATE,
    @EndDate    DATE
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        o.OrderId,
        o.OrderDate,
        o.TotalAmount,
        o.Status
    FROM Orders o
    WHERE o.CustomerId = @CustomerId
      AND o.OrderDate BETWEEN @StartDate AND @EndDate
    ORDER BY o.OrderDate DESC;
END;
GO

-- Calling the procedure
EXEC GetCustomerOrders
    @CustomerId = 12345,
    @StartDate  = '2026-01-01',
    @EndDate    = '2026-06-30';

ื”ื™ื™ืฉื•ื ืœืขื•ืœื ืœื ื›ื•ืชื‘ SQL ื™ืฉื™ืจื•ืช. ื”ื•ื ืงื•ืจื GetCustomerOrders ืขื ืคืจืžื˜ืจื™ื. ืžืกื“ ื”ื ืชื•ื ื™ื ืžื˜ืคืœ ื‘ืฉืืจ.

ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ืœืขื•ืžืช ืชืฆื•ื’ื” ืœืขื•ืžืช ืคื•ื ืงืฆื™ื”

ืฉืœื•ืฉื” ืื•ื‘ื™ื™ืงื˜ื™ื ืฉืœ ืžืกื“ ื ืชื•ื ื™ื ืžืชื‘ืœื‘ืœื™ื ืœืขืชื™ื ืงืจื•ื‘ื•ืช. ื”ื˜ื‘ืœื” ืฉืœื”ืœืŸ ืžื‘ื“ื™ืœื” ื‘ื™ื ื™ื”ื:

ื—ืคืฅื”ื—ื–ืจื™ืืžืงื‘ืœ ืคืจืžื˜ืจื™ืื™ื›ื•ืœ ืœืฉื ื•ืช ื ืชื•ื ื™ืืชื•ื›ื ื™ืช ื‘ื™ืฆื•ืข ืžืื•ื—ืกื ืช ื‘ืžื˜ืžื•ืŸื”ื›ื™ ื˜ื•ื‘
ื ื•ื”ืœ ืžืื•ื—ืกืŸืงื‘ื•ืฆื•ืช ืชื•ืฆืื•ืช, ืคืจืžื˜ืจื™ ืคืœื˜, ืงื•ื“ื™ ื”ื—ื–ืจื”ื™ืฉื™ืฉื™ืฉืœื•ื’ื™ืงื” ืžื•ืจื›ื‘ืช, ืคืขื•ืœื•ืช DML, ืื›ื™ืคืช ืื‘ื˜ื—ื”
ืœืฆืคื™ื”ืงื‘ื•ืฆืช ืชื•ืฆืื•ืช ื‘ื•ื“ื“ืช (ื›ืžื• ื˜ื‘ืœื”)ืœืืœื (ื‘ื“ืจืš ื›ืœืœ)ื—ืœืงื™ืคื™ืฉื•ื˜ ืฉืื™ืœืชื•ืช SELECT, ืื‘ื˜ื—ื” ื‘ืจืžืช ื”ืขืžื•ื“ื”
ืคื•ื ืงืฆื™ื” ืกืงืœืจื™ืชืขืจืš ื™ื—ื™ื“ื™ืฉืœืืœืื—ื™ืฉื•ื‘ื™ื ืฉื ืขืฉื” ื‘ื”ื ืฉื™ืžื•ืฉ ื—ื•ื–ืจ ื‘ืจืฉื™ืžื•ืช SELECT
ืคื•ื ืงืฆื™ื” ื‘ืขืœืช ืขืจืš ื˜ื‘ืœื”ืงื‘ื•ืฆืช ืชื•ืฆืื•ืชื™ืฉืœืื—ืœืงื™ืชืฆื•ื’ื•ืช ืคืจืžื˜ืจื™ื•ืช, ื—ื™ืฉื•ื‘ื™ื ืžื—ื–ื™ืจื™ ืงื‘ื•ืฆื•ืช

ื”ื‘ื“ืœ ืžืจื›ื–ื™: ื”ืฉืชืžืฉื• ื‘ืชืฆื•ื’ื” ื›ืืฉืจ ืืชื ืจื•ืฆื™ื ื”ืคืฉื˜ื” ืฉืœ โ€‹โ€‹SELECT ืœืฉื™ืžื•ืฉ ื—ื•ื–ืจ. ื”ืฉืชืžืฉื• ื‘ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ื›ืืฉืจ ืืชื ื–ืงื•ืงื™ื ืœืคืจืžื˜ืจื™ื, ืœื•ื’ื™ืงื” ืžื•ืชื ื™ืช, ืฉื™ื ื•ื™ ื ืชื•ื ื™ื ืื• ืื›ื™ืคืช ืื‘ื˜ื—ื”. ื”ืฉืชืžืฉื• ื‘ืคื•ื ืงืฆื™ื” ื›ืืฉืจ ืืชื ื–ืงื•ืงื™ื ืœื—ื™ืฉื•ื‘ ืฉืžื—ื–ื™ืจ ืขืจืš ืื• ื˜ื‘ืœื” ื•ื—ื™ื™ื‘ ืœื—ื‘ืจ ืื•ืชื• ืขื SQL ืื—ืจ.

ืืจื‘ืขืช ื”ื™ืชืจื•ื ื•ืช ื”ืžืจื›ื–ื™ื™ื

ื‘ื™ืฆื•ืขื™ื: ืงื“ื-ืงื•ืžืคื™ืœืฆื™ื” ื•ืื—ืกื•ืŸ ื‘ืžื˜ืžื•ืŸ ืชื•ื›ื ื™ื•ืช

ื›ืืฉืจ SQL Server, PostgreSQL ืื• Oracle ืžืงื‘ืœื™ื ืงืจื™ืื” ืœืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช, ื”ื ื‘ื•ื“ืงื™ื ืื ืงื™ื™ืžืช ืชื•ื›ื ื™ืช ื‘ื™ืฆื•ืข ืžืื•ื—ืกื ืช ื‘ืžื˜ืžื•ืŸ ืขื‘ื•ืจ ืคืจื•ืฆื“ื•ืจื” ื–ื•. ืื ืงื™ื™ืžืช ืชื•ื›ื ื™ืช ื›ื–ื•, ื”ื ืžื‘ืฆืขื™ื ืืช ื”ืชื”ืœื™ืš ื‘ืื•ืคืŸ ืžื™ื™ื“ื™. ืื ืœื, ื”ื ืงื•ืžืคื™ืœ ืืช ื”ืคืจื•ืฆื“ื•ืจื”, ื™ื•ืฆืจื™ื ืชื•ื›ื ื™ืช ื‘ื™ืฆื•ืข, ืžืื—ืกื ื™ื ืื•ืชื” ื‘ืžื˜ืžื•ืŸ ื•ืžื‘ืฆืขื™ื ืื•ืชื”. ื‘ื›ืœ ื”ืงืจื™ืื•ืช ื”ื‘ืื•ืช, ื”ืชื•ื›ื ื™ืช ื”ืžืื•ื—ืกื ืช ื‘ืžื˜ืžื•ืŸ ืžื ื•ืฆืœืช ืฉื•ื‘.

ืฉืื™ืœืชื•ืช SQL ืื“-ื”ื•ืง, ืฉืื™ืœืชื•ืช ืžืฉื•ืจืฉืจื•ืช ืžื—ืจื•ื–ื•ืช ื”ื ืฉืœื—ื•ืช ืžืงื•ื“ ืืคืœื™ืงืฆื™ื”, ืขืฉื•ื™ื•ืช ืœืขื‘ื•ืจ ืงื•ืžืคื™ืœืฆื™ื” ืžื—ื“ืฉ ื‘ื›ืœ ืงืจื™ืื”, ื‘ื”ืชืื ืœืžืกื“ ื”ื ืชื•ื ื™ื ื•ืœืžื‘ื ื” ื”ืฉืื™ืœืชื”. ืขื‘ื•ืจ ืฉืื™ืœืชื•ืช ื‘ืชื“ื™ืจื•ืช ื’ื‘ื•ื”ื” ื”ื ืงืจืื•ืช ืืœืคื™ ืคืขืžื™ื ื‘ืฉื ื™ื™ื”, ืชืงื•ืจืช ื”ืงื•ืžืคื™ืœืฆื™ื” ื”ื–ื• ืžืฉืžืขื•ืชื™ืช.

SQL

-- Demonstrating plan reuse in SQL Server
-- Check if a plan exists for a procedure
SELECT
    qs.execution_count,
    qs.total_elapsed_time / qs.execution_count AS avg_elapsed_ms,
    qs.total_logical_reads / qs.execution_count AS avg_logical_reads,
    SUBSTRING(qt.text, 1, 100) AS procedure_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
WHERE qt.text LIKE '%GetCustomerOrders%'
ORDER BY qs.execution_count DESC;

ืชืขื‘ื•ืจืช ืจืฉืช ืžื•ืคื—ืชืช ื”ื™ื ื™ืชืจื•ืŸ ื”ื‘ื™ืฆื•ืขื™ื ื”ืฉื ื™. ื‘ืžืงื•ื ืœืฉืœื•ื— ืฉืื™ืœืชืช SQL ืžื•ืจื›ื‘ืช ื‘ืช 30 ืฉื•ืจื•ืช ืžื”ื™ื™ืฉื•ื ืœืžืกื“ ื”ื ืชื•ื ื™ื ื‘ื›ืœ ืงืจื™ืื”, ื”ื™ื™ืฉื•ื ืฉื•ืœื— ืงืจื™ืื” ืงืฆืจื” ืœืคืจื•ืฆื“ื•ืจื”. ืขื•ืžืก ื”ืจืฉืช ืžื™ื ื™ืžืœื™. ืžืกื“ ื”ื ืชื•ื ื™ื ืžื‘ืฆืข ืืช ื”ื—ื™ืฉื•ื‘ ื”ื›ื‘ื“ ื‘ืฆื“ ื”ืฉืจืช ื•ืžื—ื–ื™ืจ ืจืง ืืช ืงื‘ื•ืฆืช ื”ืชื•ืฆืื•ืช.

ืื‘ื˜ื—ื”: ื”ื’ื‘ืœืช ื’ื™ืฉื” ื™ืฉื™ืจื” ืœื˜ื‘ืœื”

ื–ื”ื• ื”ื™ืชืจื•ืŸ ืฉื ืชื•ื ื™ SC ืžื—ืคืฉื™ื ืกืคืฆื™ืคื™ืช, "ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ื›ื“ื™ ืœื”ื’ื‘ื™ืœ ื’ื™ืฉื” ื™ืฉื™ืจื” ืœื ืชื•ื ื™ื ื•ืœืฉืคืจ ืืช ืื‘ื˜ื—ืช ืžืกื“ ื”ื ืชื•ื ื™ื." ื”ืžื ื’ื ื•ืŸ ื”ื•ื ืคืฉื•ื˜ ื•ื—ื–ืง.

ื”ืขื ืงืช ื”ืจืฉืื•ืช ืœืžืฉืชืžืฉื™ ืืคืœื™ืงืฆื™ื” ืขืœ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช. ืžื ื™ืขืช ื’ื™ืฉื” ื™ืฉื™ืจื” ืœื˜ื‘ืœืื•ืช ื”ื‘ืกื™ืกื™ื•ืช. ื”ืžืฉืชืžืฉ ื™ื›ื•ืœ ืœืงืจื•ื ืœืคืจื•ืฆื“ื•ืจื” ืืš ืื™ื ื• ื™ื›ื•ืœ ืœื‘ืฆืข ืฉืื™ืœืชื”, ืœื”ื•ืกื™ืฃ, ืœืขื“ื›ืŸ ืื• ืœืžื—ื•ืง ืžื”ื˜ื‘ืœื” ื™ืฉื™ืจื•ืช.

SQL

-- Create a role for application users
CREATE ROLE AppReadRole;

-- Grant execute on the procedure
GRANT EXECUTE ON GetCustomerOrders TO AppReadRole;

-- Deny direct table access
DENY SELECT ON Orders TO AppReadRole;
DENY SELECT ON Customers TO AppReadRole;

-- The user can now:
--   EXEC GetCustomerOrders @CustomerId=123, ... -> works
--   SELECT * FROM Orders WHERE ... -> ACCESS DENIED

ืžื ื™ืขืช ื”ื–ืจืงืช SQL ื”ื™ื ื™ืชืจื•ืŸ ื”ืื‘ื˜ื—ื” ื”ืฉื ื™. ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ื”ืžืฉืชืžืฉื•ืช ื‘ืงืœื˜ ืคืจืžื˜ืจื™ื–ืฆื™ื” ื‘ืžืงื•ื ื‘ื‘ื ื™ื™ืช SQL ื“ื™ื ืžื™ืช ืžื•ื’ื ื•ืช ื‘ืื•ืคืŸ ื˜ื‘ืขื™ ืžืคื ื™ ื”ื–ืจืงืช SQL. ืขืจืš ื”ืคืจืžื˜ืจ ืžื˜ื•ืคืœ ื›ืœื™ื˜ืจืœ, ื•ืœื ื›ืงื•ื“ SQL.

SQL

-- VULNERABLE: dynamic SQL built from user input
DECLARE @sql NVARCHAR(500);
SET @sql = 'SELECT * FROM Customers WHERE Name = ''' + @UserInput + '''';
EXEC(@sql);
-- An attacker can inject: '; DROP TABLE Customers; --

-- SAFE: parameterized stored procedure
CREATE PROCEDURE GetCustomerByName
    @CustomerName NVARCHAR(100)
AS
BEGIN
    SELECT CustomerId, Name, Email
    FROM Customers
    WHERE Name = @CustomerName;  -- @CustomerName is a literal, not SQL
END;

ื”ื™ื–ื”ืจ: ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ืฉื‘ื•ื ื” SQL ื“ื™ื ืžื™ ื‘ืื•ืคืŸ ืคื ื™ืžื™ ื‘ืืžืฆืขื•ืช EXEC() or sp_executesql ืขื ืฉืจืฉื•ืจ ืžื—ืจื•ื–ื•ืช ืฉืœ ืงืœื˜ ืžืฉืชืžืฉ ืคื’ื™ืข ื‘ื“ื™ื•ืง ื›ืžื• SQL ื“ื™ื ืžื™ ื‘ืจืžืช ื”ื™ื™ืฉื•ื. ืคืจืžื˜ืจื™ื–ืฆื™ื” ื—ื™ื™ื‘ืช ืœื”ืจื—ื™ื‘ ืืช ืขืฆืžื” ืœื›ืœ SQL ื“ื™ื ืžื™ ืฉื ื‘ื ื” ื‘ืชื•ืš ื”ืคืจื•ืฆื“ื•ืจื”.

ืชื—ื–ื•ืงื”: ืฉื™ื ื•ื™ ืื—ื“, ื›ืœ ื”ื™ื™ืฉื•ืžื™ื ืžืขื•ื“ื›ื ื™ื

ื›ืืฉืจ ืฉื™ื ื•ื™ื™ื ื‘ืœื•ื’ื™ืงื” ืขืกืงื™ืช, ื›ืœืœื™ ื—ื™ืฉื•ื‘ ืžืก, ืจืžื•ืช ื”ื ื—ื”, ื˜ืจื ืกืคื•ืจืžืฆื™ื•ืช ื ืชื•ื ื™ื ื”ื ื“ืจืฉื•ืช ืœืฆื™ื•ืช, ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ืžืจื›ื–ืช ืืช ื”ืœื•ื’ื™ืงื” ื”ื–ื• ื‘ืžืงื•ื ืื—ื“. ื›ืœ ื™ื™ืฉื•ื ืฉืงื•ืจื ืœืคืจื•ืฆื“ื•ืจื” ืžืงื‘ืœ ืืช ื”ื”ืชื ื”ื’ื•ืช ื”ืžืขื•ื“ื›ื ืช ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™, ืžื‘ืœื™ ืœื“ืจื•ืฉ ืคืจื™ืกื” ืžื—ื“ืฉ.

SQL

-- Before: discount logic duplicated in three application services
-- After: centralized in one stored procedure
CREATE PROCEDURE CalculateOrderTotal
    @OrderId INT,
    @DiscountedTotal DECIMAL(10,2) OUTPUT
AS
BEGIN
    DECLARE @Subtotal DECIMAL(10,2);
    DECLARE @CustomerTier NCHAR(1);

    SELECT @Subtotal     = SUM(li.Quantity * li.UnitPrice),
           @CustomerTier = c.Tier
    FROM OrderLineItems li
    JOIN Orders o ON o.OrderId = li.OrderId
    JOIN Customers c ON c.CustomerId = o.CustomerId
    WHERE li.OrderId = @OrderId
    GROUP BY c.Tier;

    -- Business rule: Gold customers get 15%, Silver get 8%, Standard get 0%
    SET @DiscountedTotal = @Subtotal * CASE @CustomerTier
        WHEN 'G' THEN 0.85
        WHEN 'S' THEN 0.92
        ELSE 1.00
    END;
END;

ืฉื ื” ืืช ืื—ื•ื–ื™ ื”ื”ื ื—ื” ื‘ืžืงื•ื ืื—ื“. ื›ืœ ืฉืœื•ืฉืช ืฉื™ืจื•ืชื™ ื”ืืคืœื™ืงืฆื™ื•ืช ืฉืงื•ืจืื™ื CalculateOrderTotal ื™ืฉืงืคื• ื‘ืื•ืคืŸ ืžื™ื™ื“ื™ ืืช ื”ืชืขืจื™ืคื™ื ื”ื—ื“ืฉื™ื.

ืื ืงืคืกื•ืœืฆื™ื” ืขื ืคืจืžื˜ืจื™ ืคืœื˜ ื•ื˜ื™ืคื•ืœ ื‘ืฉื’ื™ืื•ืช

ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืžื—ื–ื™ืจื•ืช ืขืจื›ื™ื ืžืจื•ื‘ื™ื ื“ืจืš ืคืจืžื˜ืจื™ ืคืœื˜ ื•ืžืขื‘ื™ืจื•ืช ืืช ืกื˜ื˜ื•ืก ื”ืขื™ื‘ื•ื“ ื‘ืืžืฆืขื•ืช ืงื•ื“ื™ ื”ื—ื–ืจื”, ืžื” ืฉืžืืคืฉืจ ื“ืคื•ืกื™ ืื™ื ื˜ืจืืงืฆื™ื” ืขืฉื™ืจื™ื ื™ื•ืชืจ ืžืืฉืจ SELECT ืคืฉื•ื˜.

SQL

CREATE PROCEDURE InsertOrder
    @CustomerId  INT,
    @OrderDate   DATE,
    @NewOrderId  INT OUTPUT,
    @StatusCode  INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        BEGIN TRANSACTION;

        INSERT INTO Orders (CustomerId, OrderDate, Status)
        VALUES (@CustomerId, @OrderDate, 'PENDING');

        SET @NewOrderId = SCOPE_IDENTITY();
        SET @StatusCode = 0;  -- success

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION;
        SET @StatusCode = ERROR_NUMBER();
        SET @NewOrderId = -1;
    END CATCH;
END;

-- Usage
DECLARE @OrderId INT, @Status INT;
EXEC InsertOrder
    @CustomerId = 5001,
    @OrderDate  = '2026-07-15',
    @NewOrderId = @OrderId OUTPUT,
    @StatusCode = @Status OUTPUT;

IF @Status <> 0
    PRINT 'Insert failed with error: ' + CAST(@Status AS VARCHAR);
ELSE
    PRINT 'Created order: ' + CAST(@OrderId AS VARCHAR);

ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืฉืœ ื‘ื™ืฆื•ืขื™ื: ืžื” ืชื•ื›ื ื™ืช ื”ื‘ื™ืฆื•ืข ืื•ืžืจืช ืœืš

ืชื•ื›ื ื™ืช ื”ื‘ื™ืฆื•ืข ื”ื™ื ืจื™ืฉื•ื ืฉืœ ืžื ื•ืข ืžืกื“ ื”ื ืชื•ื ื™ื ื›ื™ืฆื“ ื”ื•ื ื‘ื—ืจ ืœื‘ืฆืข ืฉืื™ืœืชื”, ืื™ืœื• ืื™ื ื“ืงืกื™ื ื”ืฉืชืžืฉื• ื‘ื”, ืื™ื–ื” ืืœื’ื•ืจื™ืชื ืฆื™ืจื•ืฃ ื”ื•ื ื‘ื—ืจ, ื•ื›ืžื” ืฉื•ืจื•ืช ื”ื•ื ื”ืขืจื™ืš ื‘ื›ืœ ืฉืœื‘. ืขื‘ื•ืจ ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ื”ื ืงืจืืช ืืœืคื™ ืคืขืžื™ื ื‘ื™ื•ื, ืชื•ื›ื ื™ืช ื”ื‘ื™ืฆื•ืข ื”ื™ื ื›ืœื™ ื”ืื‘ื—ื•ืŸ ื”ืขื™ืงืจื™ ืœื‘ืขื™ื•ืช ื‘ื™ืฆื•ืขื™ื.

SQL

-- Enable actual execution plan in SQL Server
-- Then run:
EXEC GetCustomerOrders
    @CustomerId = 12345,
    @StartDate  = '2026-01-01',
    @EndDate    = '2026-06-30';

-- Check for parameter sniffing issues
-- (cached plan was optimized for a different parameter distribution)
EXEC GetCustomerOrders
    @CustomerId = 99999,  -- rare customer with very few orders
    @StartDate  = '2026-01-01',
    @EndDate    = '2026-06-30'
WITH RECOMPILE;  -- forces fresh plan for this call

ืจื™ื— ืคืจืžื˜ืจื™ื ื”ื•ื ื‘ืขื™ื™ืช ื”ื‘ื™ืฆื•ืขื™ื ื”ื ืคื•ืฆื” ื‘ื™ื•ืชืจ ืฉืœ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช. SQL Server ืžืื—ืกืŸ ื‘ืžื˜ืžื•ืŸ ืืช ืชื•ื›ื ื™ืช ื”ื‘ื™ืฆื•ืข ืฉื ื•ืฆืจื” ืขื‘ื•ืจ ืงื‘ื•ืฆืช ื”ืคืจืžื˜ืจื™ื ื”ืจืืฉื•ื ื” ืฉื‘ื” ื ืงืจืืช ื”ืคืจื•ืฆื“ื•ืจื”. ืื ืงืจื™ืื•ืช ืขื•ืงื‘ื•ืช ืžืฉืชืžืฉื•ืช ื‘ืขืจื›ื™ ืคืจืžื˜ืจื™ื ืฉื•ื ื™ื ืžืื•ื“, ืœืงื•ื— ืขื 50,000 ื”ื–ืžื ื•ืช ืœืขื•ืžืช ืœืงื•ื— ืขื 2 ื”ื–ืžื ื•ืช, ื”ืชื•ื›ื ื™ืช ื”ืžืื•ื—ืกื ืช ื‘ืžื˜ืžื•ืŸ ืขืฉื•ื™ื” ืœื”ื™ื•ืช ืชืช-ืื•ืคื˜ื™ืžืœื™ืช ืžืื•ื“ ืขื‘ื•ืจ ืขืจื›ื™ื ืืœื”.

ืืกื˜ืจื˜ื’ื™ื•ืช ื”ืคื—ืชื”: OPTIMIZE FOR ืจืžื– ืœืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืขื‘ื•ืจ ืขืจืš ืคืจืžื˜ืจ ืžื™ื™ืฆื’; WITH RECOMPILE ื‘ืจืžืช ื”ืคืจื•ืฆื“ื•ืจื” ื›ื“ื™ ืœื™ืฆื•ืจ ืชื•ื›ื ื™ืช ื—ื“ืฉื” ื‘ื›ืœ ืงืจื™ืื” (ื™ืงืจ, ืืš ื™ืขื™ืœ ื›ืืฉืจ ื”ืชืคืœื’ื•ืช ื”ืคืจืžื˜ืจื™ื ืžืฉืชื ื” ืžืื•ื“); ื”ืงืฆืืช ืžืฉืชื ื™ื ืžืงื•ืžื™ืช ื‘ืชื—ื™ืœืช ื”ืคืจื•ืฆื“ื•ืจื” ื›ื“ื™ ืœืžื ื•ืข ืจื—ืจื•ื— (sniffing):

SQL

CREATE PROCEDURE GetCustomerOrders
    @CustomerId INT,
    @StartDate  DATE,
    @EndDate    DATE
AS
BEGIN
    -- Local variable trick: prevents parameter sniffing
    DECLARE @LocalCustomerId INT = @CustomerId;
    DECLARE @LocalStart      DATE = @StartDate;
    DECLARE @LocalEnd        DATE = @EndDate;

    SELECT o.OrderId, o.OrderDate, o.TotalAmount
    FROM Orders o
    WHERE o.CustomerId = @LocalCustomerId
      AND o.OrderDate BETWEEN @LocalStart AND @LocalEnd;
END;

ืฉื™ื˜ื•ืช ืขื‘ื•ื“ื” ืžื•ืžืœืฆื•ืช: ืจืฉื™ืžืช ื‘ื“ื™ืงื”

ื‘ืžืงื•ื ืขืงืจื•ื ื•ืช ื›ืœืœื™ื™ื, ืืœื• ื”ืŸ ื”ืคืจืงื˜ื™ืงื•ืช ืฉื”ื•ืคื›ื•ืช ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืœื ื™ืชื ื•ืช ืœืชื—ื–ื•ืงื” ื‘ืงื ื” ืžื™ื“ื” ื’ื“ื•ืœ:

ืžืชืŸ ืฉืžื•ืช ื•ืืจื’ื•ืŸ

  • ื”ืฉืชืžืฉื• ื‘ืžื•ืกื›ืžื” ืขืงื‘ื™ืช ืœืžืชืŸ ืฉืžื•ืช: usp_ ืงื™ื“ื•ืžืช ืขื‘ื•ืจ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืขืœ ื™ื“ื™ ื”ืžืฉืชืžืฉ, sp_ ืฉืžื•ืจื•ืช ืœื ื”ืœื™ ืžืขืจื›ืช
  • ืžืชืŸ ืฉื ืœื ื”ืœื™ื ืœืคื™ ืคื•ืขืœ + ืฉื ืขืฆื: GetCustomerOrders, InsertPaymentRecord, UpdateInventoryCount
  • ืงื‘ืฅ ืคืจื•ืฆื“ื•ืจื•ืช ืงืฉื•ืจื•ืช ื‘ืกื›ื™ืžื”: Sales.GetCustomerOrders, Inventory.UpdateStock

ืžื‘ื ื” ืงื•ื“

  • ื”ืชื—ืœ ื›ืœ ื”ืœื™ืš ืขื SET NOCOUNT ON ื›ื“ื™ ืœื”ืฉืชื™ืง ื”ื•ื“ืขื•ืช ืกืคื™ืจืช ืฉื•ืจื•ืช ืฉืœืงื•ื—ื•ืช ืขืœื•ืœื™ื ืœืคืจืฉ ื‘ืื•ืคืŸ ืฉื’ื•ื™
  • ื”ืฉืชืžืฉ BEGIN TRY / BEGIN CATCH ื‘ืœื•ืงื™ื ืขื ืžืคื•ืจืฉ BEGIN TRANSACTION / COMMIT / ROLLBACK
  • ื”ื™ืžื ืขื• ืžืกืžื ื™ื ืขื‘ื•ืจ ืคืขื•ืœื•ืช ืงื‘ื•ืฆื”, ื›ืชื‘ื• ืžื—ื“ืฉ ื›-SQL ืžื‘ื•ืกืก ืงื‘ื•ืฆื” ื‘ืžื™ื“ืช ื”ืืคืฉืจ
  • ืื™ืŸ ืœื”ืฉืชืžืฉ SELECT *, ืชืŸ ืฉื ืœื›ืœ ืขืžื•ื“ื” ืฉื”ืคืจื•ืฆื“ื•ืจื” ืžื—ื–ื™ืจื”

ืื‘ื˜ื—ื”

  • ื”ืขื ืงืช ื”ืจืฉืื•ืช ื‘ื™ืฆื•ืข ืขืœ ืคืจื•ืฆื“ื•ืจื•ืช; ืžื ื™ืขืช ื’ื™ืฉื” ื™ืฉื™ืจื” ืœื˜ื‘ืœื” ืขื‘ื•ืจ ืชืคืงื™ื“ื™ ื™ื™ืฉื•ืžื™ื
  • ื”ื™ืžื ืขื• ืž-SQL ื“ื™ื ืžื™ ืฉื ื‘ื ื” ืžืงืœื˜ ืžืฉืชืžืฉ ื‘ืชื•ืš ืคืจื•ืฆื“ื•ืจื•ืช
  • ื”ืฉืชืžืฉ sp_executesql ืขื ืฉืื™ืœืชื•ืช ืคืจืžื˜ืจื™ื•ืช ืื SQL ื“ื™ื ืžื™ ื”ื•ื ื‘ืœืชื™ ื ืžื ืข

ื‘ื™ืฆื•ืข

  • ื‘ื“ื™ืงืช ืชื•ื›ื ื™ื•ืช ื‘ื™ืฆื•ืข ืขื‘ื•ืจ ืกืจื™ืงื•ืช ื˜ื‘ืœืื•ืช ื‘ื˜ื‘ืœืื•ืช ื’ื“ื•ืœื•ืช, ื”ื•ืกืคืช ืื™ื ื“ืงืกื™ื ื‘ืžื™ื“ืช ื”ืฆื•ืจืš
  • ื‘ื“ื™ืงื” ืขื ืขืจื›ื™ ืคืจืžื˜ืจื™ื ืžื™ื™ืฆื’ื™ื ืขื‘ื•ืจ ืคืจื•ืฆื“ื•ืจื•ืช ื”ืจื’ื™ืฉื•ืช ืœื”ืกืจื™ื—
  • ืฆื’ sys.dm_exec_procedure_stats ืขื‘ื•ืจ ื”ืœื™ื›ื™ื ื‘ืขืœื™ ื‘ื™ืฆื•ืข ื’ื‘ื•ื” ืื• ืžืฉืš ื–ืžืŸ ืืจื•ืš

ืชื™ืขื•ื“

  • ื”ื•ืกืฃ ื”ืขืจื” ื‘ื›ื•ืชืจืช ืœื›ืœ ืคืจื•ืฆื“ื•ืจื”: ืžื˜ืจื”, ืคืจืžื˜ืจื™ื, ืขืจื›ื™ื ืžื•ื—ื–ืจื™ื, ืžื—ื‘ืจ, ืฉื™ื ื•ื™ ืื—ืจื•ืŸ
  • ื›ืœืœื™ ืขืกืงื™ื™ื ืžืชืขื“ื™ื ื”ืžืงื•ื“ื“ื™ื ื‘ืœื•ื’ื™ืงืช ื”ืคืจื•ืฆื“ื•ืจื•ืช, ืœื ืจืง ืžื” ื”-SQL ืขื•ืฉื”, ืืœื ืžื“ื•ืข

ื ื™ื”ื•ืœ ื”ืชืœื•ืช ื‘ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช

ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืื™ื ืŸ ืงื™ื™ืžื•ืช ื‘ื‘ื™ื“ื•ื“. ืคืจื•ืฆื“ื•ืจื” ืฉืงื•ืจืืช ืžื—ืžืฉ ื˜ื‘ืœืื•ืช, ืงื•ืจืืช ืœืฉืชื™ ืคืจื•ืฆื“ื•ืจื•ืช ืื—ืจื•ืช, ื•ื ืงืจืืช ืขืœ ื™ื“ื™ ืชืจื™ืกืจ ืฉื™ืจื•ืชื™ ื™ื™ืฉื•ืžื™ื, ื”ื™ื ืจื›ื™ื‘ ื‘ืขืœ ืชืœื•ื™ื•ืช ืžื•ืจื›ื‘ื•ืช ื‘ื›ืœ ืฉืœื•ืฉืช ื”ื›ื™ื•ื•ื ื™ื: ื‘ืžื” ื”ื™ื ืชืœื•ื™ื”, ืžื” ืชืœื•ื™ ื‘ื”, ื•ืžื” ื”ื™ื ื—ื•ืœืงืช ืขื ืคืจื•ืฆื“ื•ืจื•ืช ืื—ืจื•ืช.

ื›ืืฉืจ ืขืžื•ื“ื” ื‘ื˜ื‘ืœื” ืžืฉื ื” ืกื•ื’, ื™ืฉ ืœื‘ื“ื•ืง ื›ืœ ืคืจื•ืฆื“ื•ืจื” ื”ืžืคื ื” ืœืขืžื•ื“ื” ื–ื•. ื›ืืฉืจ ืคื•ืจืžื˜ ื”ืคืœื˜ ืฉืœ ืคืจื•ืฆื“ื•ืจื” ืžืฉืชื ื”, ื™ืฉ ืœืืžืช ื›ืœ ืงื•ืจื. ื›ืืฉืจ ืคืจื•ืฆื“ื•ืจื” ื ืฉืงืœืช ืœืฉื™ื ื•ื™, ืงื‘ื•ืฆืช ื”ืงื•ืจืื™ื ื”ืžืœืื” ืงื•ื‘ืขืช ืืช ื”ื™ืงืฃ ื”ืฉื™ื ื•ื™ ื•ืืช ื‘ื“ื™ืงื•ืช ื”ืจื’ืจืกื™ื” ื”ื ื“ืจืฉื•ืช.

ืกื•ื’ื™ ืชืœื•ืช ืฉื—ืฉื•ื‘ื™ื:

  • ืชืœื•ื™ื•ืช ืื•ื‘ื™ื™ืงื˜ื™ื: ื˜ื‘ืœืื•ืช, ืชืฆื•ื’ื•ืช, ืคื•ื ืงืฆื™ื•ืช ื•ืคืจื•ืฆื“ื•ืจื•ืช ืื—ืจื•ืช ืฉื”ืคืจื•ืฆื“ื•ืจื” ืžืคื ื” ืืœื™ื”ืŸ
  • ืชืœื•ื™ื•ืช ื‘ืžืชืงืฉืจ: ืงื•ื“ ื™ื™ืฉื•ื, ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืื—ืจื•ืช ื•ืžืฉื™ืžื•ืช ืžืชื•ื–ืžื ื•ืช ื”ืงื•ืจืื•ืช ืœืคืจื•ืฆื“ื•ืจื” ื–ื•
  • ืชืœื•ื™ื•ืช ืกื›ื™ืžื”: ื˜ื‘ืœืื•ืช ื•ื”ื’ื“ืจื•ืช ืขืžื•ื“ื•ืช ืฉืกื•ื’ื™ ื”ืคืจืžื˜ืจื™ื ื•ืจืฉื™ืžื•ืช ื”-SELECT ืฉืœ ื”ืคืจื•ืฆื“ื•ืจื” ื—ื™ื™ื‘ื™ื ืœื”ืชืื™ื ืืœื™ื”ืŸ
  • ืชืœื•ื™ื•ืช ืขืกืงืื•ืช: ืคืจื•ืฆื“ื•ืจื•ืช ืฉื—ื•ืœืงื•ืช ืืช ื˜ื•ื•ื— ื”ืขืกืงื” ืขื ื”ืงื•ืจืื™ื ืฉืœื”ืŸ ืื• ื–ื• ืขื ื–ื•

ื‘ืžืกื“ ื ืชื•ื ื™ื ืงื˜ืŸ ืขื ืขืฉืจ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช, ื ื™ืชืŸ ืœืขืงื•ื‘ ื™ื“ื ื™ืช ืื—ืจ ืชืœื•ื™ื•ืช ืืœื•. ื‘ืžืกื“ ื ืชื•ื ื™ื ืขื ืžืื•ืช ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช, ื“ื‘ืจ ื ืคื•ืฅ ื‘ืกื‘ื™ื‘ื•ืช ืืจื’ื•ื ื™ื•ืช ื‘ื”ืŸ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืžื›ื™ืœื•ืช ืฉื ื™ื ืฉืœ ืœื•ื’ื™ืงื” ืขืกืงื™ืช, ืžืขืงื‘ ื™ื“ื ื™ ืื—ืจ ืชืœื•ื™ื•ืช ืžื™ื™ืฆืจ ืžืคื•ืช ืœื ืฉืœืžื•ืช ื•ืื™ืจื•ืขื™ื ื”ืงืฉื•ืจื™ื ืœืฉื™ื ื•ื™.

ืื™ืš SMART TS XL ื ื™ื”ื•ืœ ืชืœื•ื™ื•ืช ืฉืœ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ื‘ืงื ื” ืžื™ื“ื” ืืจื’ื•ื ื™

SMART TS XL"S ื ื™ืชื•ื— ืงื•ื“ ืกื˜ื˜ื™ ืžื ืชื— ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืฉืœ SQL ืœืฆื“ ืชื•ื›ื ื™ื•ืช COBOL, ืฉื™ืจื•ืชื™ Java, ืฆื™ื ื•ืจื•ืช Python ื•ืจื›ื™ื‘ื™ื ืื—ืจื™ื ื”ืžืงื™ื™ืžื™ื ืื™ื ื˜ืจืืงืฆื™ื” ืขื ืื•ืชื• ืžืกื“ ื ืชื•ื ื™ื. ื”ื ื™ืชื•ื— ื”ืžืื•ื—ื“ ืžื™ื™ืฆืจ ืžื•ื“ืœ ืžื‘ื ื™ ื—ื•ืฆื” ืฉืคื•ืช: ืœื ืจืง ื”ืชืœื•ื™ื•ืช ื‘ื™ืŸ SQL ืœ-SQL ื‘ืชื•ืš ืžืกื“ ื”ื ืชื•ื ื™ื, ืืœื ืืช ื”ืฉืจืฉืจืช ื”ืžืœืื” ืžืงื•ื“ ื”ืืคืœื™ืงืฆื™ื” ื“ืจืš ื”ืคืจื•ืฆื“ื•ืจื” ื”ืžืื•ื—ืกื ืช ื•ืขื“ ืœื˜ื‘ืœืื•ืช ื”ื‘ืกื™ืกื™ื•ืช ื•ื—ื–ืจื”.

ื™ื›ื•ืœืช ืžื™ืคื•ื™ ื”ืชืœื•ืช ืฉืœ ื”ื™ื™ืฉื•ืžื™ื ื‘ื•ื ื” ืืช ื’ืจืฃ ื”ืงื•ืจื ื”ืžืœื: ืื™ืœื• ืชื•ื›ื ื™ื•ืช COBOL ืžืฉืชืžืฉื•ืช ื‘-SQL ืžื•ื˜ืžืข ืฉืงื•ืจื ืžื˜ื‘ืœืื•ืช ืฉื‘ื‘ืขืœื•ืช ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช, ืื™ืœื• ืฉื™ืจื•ืชื™ Java ืงื•ืจืื™ื ืœืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ื“ืจืš JDBC, ืื™ืœื• ืขื‘ื•ื“ื•ืช ืืฆื•ื•ื” ืฉืœ JCL ืžืคืขื™ืœื•ืช ื›ืœื™ ืฉื™ืจื•ืช ืฉืœ ืžืกื“ ื ืชื•ื ื™ื ืฉืžืจื™ืฆื•ืช ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช. ื›ืืฉืจ ื”ื—ืชื™ืžื” ืื• ื”ื”ืชื ื”ื’ื•ืช ืฉืœ ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ืžืฉืชื ื•ืช, ืžืคืช ื”ืชืœื•ืช ืžืฆื™ื’ื” ื›ืœ ืงื•ืจื ื‘ื›ืœ ืฉืคื”, ืืช ื”ื”ื™ืงืฃ ื”ืžืœื ืฉืœ ืžื” ืฉืฆืจื™ืš ืœื‘ื“ื•ืง ืœืคื ื™ ืฉื”ืฉื™ื ื•ื™ ืขื•ื‘ืจ ืœื™ื™ืฆื•ืจ.

ื”ืฉืžื™ื™ื ื ื™ืชื•ื— ื”ืฉืคืขื•ืช ื”ื™ื›ื•ืœืช ื”ื•ืคื›ืช ืืช ืžืคืช ื”ืชืœื•ืช ื”ื–ื• ืœื ื™ืชื ืช ืœืคืขื•ืœื” ืœืฆื•ืจืš ืชื›ื ื•ืŸ ืฉื™ื ื•ื™ื™ื: ืœื”ืฆื™ืข ืฉื™ื ื•ื™ ืœ CalculateOrderTotal ื•ืœืงื‘ืœ ืจืฉื™ืžื” ืžืคื•ืจื˜ืช ืฉืœ ื›ืœ ืจื›ื™ื‘ ืฉืงื•ืจื ืœื•, ื›ืœ ื˜ื‘ืœื” ืฉื”ื•ื ืงื•ืจื ื•ื›ื•ืชื‘, ื•ื›ืœ ืคืจื•ืฆื“ื•ืจื” ื‘ืžื•ืจื“ ื”ื–ืจื ืฉื”ื•ื ืžืคืขื™ืœ. ื–ื” ื”ื•ืคืš ืืช ื”ืฉืืœื” "ืžื” ื–ื” ื™ืฉื‘ื•ืจ?" ืžืชืจื’ื™ืœ ื‘ื™ื“ืข ืฉื‘ื˜ื™ ืœื“ื•ื— ื”ื™ืงืฃ ืžื•ื‘ื ื” ื•ืžื‘ื•ืกืก ืจืื™ื•ืช.

ื”ืฉืžื™ื™ื ื—ื™ืคื•ืฉ ืืจื’ื•ื ื™ ื”ื™ื›ื•ืœืช ื”ื•ืคื›ืช ืืช ืžื•ื“ืœ ื”ืชืœื•ืช ื”ืžืœื ืœื ื™ืชืŸ ืœืฉืื™ืœืชื”: ืžืฆื ื›ืœ ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ืฉืงื•ืจืืช ืž Ordersื›ืœ ืžืชืงืฉืจ ืฉืœ GetCustomerOrders, ื›ืœ ืคืจื•ืฆื“ื•ืจื” ืฉืžืฉื ื” ืขืžื•ื“ื” ืกืคืฆื™ืคื™ืช, ืชื•ืš ืฉื ื™ื•ืช, ืขืœ ืคื ื™ ืฉื˜ื— ืžืกื“ ื ืชื•ื ื™ื ื‘ื›ืœ ื’ื•ื“ืœ.

ืขื‘ื•ืจ ืฆื•ื•ืชื™ื ื”ืžื ื”ืœื™ื ืžื•ื“ืจื ื™ื–ืฆื™ื” ืžื•ืจืฉืช ืชื•ื›ื ื™ื•ืช ืฉื‘ื”ืŸ ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืžืงื•ื“ื“ื•ืช ืขืฉืจื•ืช ืฉื ื™ื ืฉืœ ืœื•ื’ื™ืงื” ืขืกืงื™ืช ืฉื™ืฉ ืœืฉืžืจ ื‘ืžื”ืœืš ื”ื”ืขื‘ืจื”, SMART TS XLื”ื ื™ืชื•ื— ืฉืœ ืžืกืคืง ืืช ื”ืชื™ืขื•ื“ ื”ืžื‘ื ื™ ืฉื”ื•ืคืš ืืช ื”ืœื•ื’ื™ืงื” ืœื ื™ืชื ืช ืœื—ื™ืœื•ืฅ ื•ืืช ืจืฆืฃ ื”ื”ื’ื™ืจื” ืœื ื™ืชืŸ ืœืชื›ื ื•ืŸ.

ืฉื›ื‘ืช ืžืกื“ ื”ื ืชื•ื ื™ื ืฉืžืจื•ื•ื™ื—ื” ืืช ืžืงื•ืžื”

ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช ืื™ื ืŸ ืฉืจื™ื“ ืžืขื™ื“ืŸ ืžืกื“ื™ ื ืชื•ื ื™ื ืงื•ื“ื. ื”ืŸ ื”ืžืงื•ื ื”ื ื›ื•ืŸ ืœื”ืฆื™ื‘ ื‘ื• ืœื•ื’ื™ืงื” ืฉืฉื™ื™ื›ืช ืœืžืกื“ ื”ื ืชื•ื ื™ื: ืื›ื™ืคืช ืื‘ื˜ื—ื” ืฉื—ื™ื™ื‘ืช ืœื”ื™ื•ืช ืขืงื‘ื™ืช ืœืœื ืงืฉืจ ืœื™ื™ืฉื•ื ืฉื ื™ื’ืฉ ืœื ืชื•ื ื™ื, ืฉืื™ืœืชื•ืช ืจื’ื™ืฉื•ืช ืœื‘ื™ืฆื•ืขื™ื ืฉื ื”ื ื•ืช ืžืชื•ื›ื ื™ื•ืช ื‘ื™ืฆื•ืข ื”ืžืื•ื—ืกื ื•ืช ื‘ืžื˜ืžื•ืŸ, ื•ื›ืœืœื™ ืขืกืงื™ื ืฉืฆืจื™ื›ื™ื ืœื”ืชืขื“ื›ืŸ ืคืขื ืื—ืช ื•ืœื”ืชืคืฉื˜ ื‘ื›ืœ ืžืงื•ื.

ื”ืžืœื›ื•ื“ืช ืื™ื ื” ืžืฉืชืžืฉืช ื‘ืคืจื•ืฆื“ื•ืจื•ืช ืžืื•ื—ืกื ื•ืช, ืืœื ืžืืคืฉืจืช ืœื”ืŸ ืœื’ื“ื•ืœ ืœืจืฉืช ืชืœื•ืช ืœื ืžืชื•ืขื“ืช ื•ืœื ืžืžื•ืคื” ืฉืืฃ ืื—ื“ ืœื ืžื‘ื™ืŸ ื‘ืžืœื•ืื”. ืคืจื•ืฆื“ื•ืจื” ืžืื•ื—ืกื ืช ืฉืžื‘ืฆืขืช ื—ื™ืฉื•ื‘ ืขืกืงื™ ืงืจื™ื˜ื™ ืืš ืœืœื ืงื•ืจืื™ื ืžืชื•ืขื“ื™ื, ืœืœื ื”ืขืจืช ื›ื•ืชืจืช ื”ืžืกื‘ื™ืจื” ืืช ืžื˜ืจืชื”, ื•ืœืœื ื ื™ืชื•ื— ื”ืฉืคืขื” ืœืคื ื™ ื”ืฉื™ื ื•ื™ ื”ื™ื ื ื˜ืœ ืœืœื ืงืฉืจ ืœื›ืžื” ื˜ื•ื‘ ื”ื™ื ื ื›ืชื‘ื”. ื ื™ื”ื•ืœ ื’ืจืฃ ื”ืชืœื•ืช ื—ืฉื•ื‘ ื›ืžื• ื ื™ื”ื•ืœ ื”-SQL ืขืฆืžื•. ืฉื ื™ื”ื ื“ื•ืจืฉื™ื ื ื™ืชื•ื— ืฉื™ื˜ืชื™ ื•ืœื ื™ื“ืข ืฉื‘ื˜ื™.