runtime
66 / 88

lesson 66 Database engineering · advanced

Stored procedures: parameters & contracts

Understand parameters and the expectations of stored procedures.

the idea

A stored procedure packages a parameterized operation behind a stable contract: given inputs, return defined columns. SQLite has no stored procedures; the same contract is a query with one parameter value. Design the result first: inputs, output columns, ordering and what happens when nothing matches.

Dataset: Logistics

The tables the challenges use, with their first 6 rows. Under each column name: the kind of value it holds, and which table it links to.

packages8 columns · 11,505 rows
package_idnumber · unique idshipment_idnumber · links to shipmentstracking_numbertextpackage_typetextweight_kgdecimallength_cmnumberwidth_cmnumberheight_cmnumber
11RT100007919Bbox2.85521530
21RT100015838Cbox1.1694524
32RT10 0023 757Denvelope0.4932242
43RT100031676Ebox2.9351355
54RT100039595Fenvelope0.3832243
65RT100047514Gbox1.9302725
package_idnumber · unique id
1
shipment_idnumber · links to shipments
1
tracking_numbertext
RT100007919B
package_typetext
box
weight_kgdecimal
2.85
length_cmnumber
52
width_cmnumber
15
height_cmnumber
30
package_idnumber · unique id
2
shipment_idnumber · links to shipments
1
tracking_numbertext
RT100015838C
package_typetext
box
weight_kgdecimal
1.1
length_cmnumber
69
width_cmnumber
45
height_cmnumber
24
package_idnumber · unique id
3
shipment_idnumber · links to shipments
2
tracking_numbertext
RT10 0023 757D
package_typetext
envelope
weight_kgdecimal
0.49
length_cmnumber
32
width_cmnumber
24
height_cmnumber
2
package_idnumber · unique id
4
shipment_idnumber · links to shipments
3
tracking_numbertext
RT100031676E
package_typetext
box
weight_kgdecimal
2.93
length_cmnumber
51
width_cmnumber
35
height_cmnumber
5
package_idnumber · unique id
5
shipment_idnumber · links to shipments
4
tracking_numbertext
RT100039595F
package_typetext
envelope
weight_kgdecimal
0.38
length_cmnumber
32
width_cmnumber
24
height_cmnumber
3
package_idnumber · unique id
6
shipment_idnumber · links to shipments
5
tracking_numbertext
RT100047514G
package_typetext
box
weight_kgdecimal
1.9
length_cmnumber
30
width_cmnumber
27
height_cmnumber
25

first 6 of 11,505 rows · your queries use all of them

tracking_events9 columns · 100,515 rows
event_idnumber · unique idpackage_idnumber · links to packagesevent_typetextevent_atdate & timerecorded_atdate & timewarehouse_idnumber · links to warehousesevent_sourcetextexception_codetextdriver_idnumber
16359created2025-01-01 00:03:462025-01-01 00:04:36NULLmanualNULLNULL
210950created2025-01-01 00:33:122025-01-01 00:35:16NULLmanualNULLNULL
32045created2025-01-01 00:35:002025-01-01 00:37:08NULLmanualNULLNULL
45977created2025-01-01 00:47:342025-01-01 00:48:13NULLmanualNULLNULL
54930created2025-01-01 00:55:092025-01-01 00:57:10NULLmanualNULLNULL
66331created2025-01-01 01:34:232025-01-01 01:35:30NULLmanualNULLNULL
event_idnumber · unique id
1
package_idnumber · links to packages
6359
event_typetext
created
event_atdate & time
2025-01-01 00:03:46
recorded_atdate & time
2025-01-01 00:04:36
warehouse_idnumber · links to warehouses
NULL
event_sourcetext
manual
exception_codetext
NULL
driver_idnumber
NULL
event_idnumber · unique id
2
package_idnumber · links to packages
10950
event_typetext
created
event_atdate & time
2025-01-01 00:33:12
recorded_atdate & time
2025-01-01 00:35:16
warehouse_idnumber · links to warehouses
NULL
event_sourcetext
manual
exception_codetext
NULL
driver_idnumber
NULL
event_idnumber · unique id
3
package_idnumber · links to packages
2045
event_typetext
created
event_atdate & time
2025-01-01 00:35:00
recorded_atdate & time
2025-01-01 00:37:08
warehouse_idnumber · links to warehouses
NULL
event_sourcetext
manual
exception_codetext
NULL
driver_idnumber
NULL
event_idnumber · unique id
4
package_idnumber · links to packages
5977
event_typetext
created
event_atdate & time
2025-01-01 00:47:34
recorded_atdate & time
2025-01-01 00:48:13
warehouse_idnumber · links to warehouses
NULL
event_sourcetext
manual
exception_codetext
NULL
driver_idnumber
NULL
event_idnumber · unique id
5
package_idnumber · links to packages
4930
event_typetext
created
event_atdate & time
2025-01-01 00:55:09
recorded_atdate & time
2025-01-01 00:57:10
warehouse_idnumber · links to warehouses
NULL
event_sourcetext
manual
exception_codetext
NULL
driver_idnumber
NULL
event_idnumber · unique id
6
package_idnumber · links to packages
6331
event_typetext
created
event_atdate & time
2025-01-01 01:34:23
recorded_atdate & time
2025-01-01 01:35:30
warehouse_idnumber · links to warehouses
NULL
event_sourcetext
manual
exception_codetext
NULL
driver_idnumber
NULL

first 6 of 100,515 rows · your queries use all of them

worked example

Run these steps in order to see the idea before you write your own query. The step marked “the pattern” is what the challenges ask for. Running the example does not count toward progress.

  1. Inspect one shipment header. Shipment 6 stands in for :shipment_id. You see the reference, service level, and created_at—the inputs a caller passes into get_shipment_packages.

    step-1.sql
    SELECT shipment_id, order_reference, service_level_id, created_at
    FROM shipments
    WHERE shipment_id = 6;
  2. List packages for that shipment. These rows are the contract output: package_id, tracking_number, and weight_kg. An unknown shipment would still return the same columns with zero rows.

    step-2.sql
    SELECT package_id, tracking_number, weight_kg
    FROM packages
    WHERE shipment_id = 6;
  3. Put it together. The lesson's pattern in one query.the pattern

    example.sql
    -- get_shipment_packages(:shipment_id)
    
    SELECT package_id, tracking_number, weight_kg
    FROM packages
    WHERE shipment_id = 6;

common mistake

A contract that returns an empty result for an unknown id must still return the same columns, so callers can rely on the shape.

challenge 1

Implement the contract get_shipment_packages(:shipment_id) for shipment 6: return package_id, tracking_number, package_type and weight_kg for its packages.

what to return

Columns
package_idtracking_numberpackage_typeweight_kg in this order
Rows
any order
challenge-1.sql
 
To master this lesson, solve both challenges without hints and pass the concept check. 3 of 3 to go.
Stored procedures: parameters & contracts — Database engineering · Runtime