38.4. User-Defined Procedures

|38.4. User-Defined Procedures|                 |                         |                  |                       |
|:---------------------------:|-----------------|-------------------------|------------------|-----------------------|
|     [Prev](xfunc.html)      |[Up](extend.html)|Chapter 38. Extending SQL|[Home](index.html)| [Next](xfunc-sql.html)|

---

## 38.4. User-Defined Procedures

[]()

 A procedure is a database object similar to a function. The key differences are:

* Procedures are defined with the [`CREATE PROCEDURE`](sql-createprocedure.html) command, not `CREATE FUNCTION`.

* Procedures do not return a function value; hence `CREATE PROCEDURE` lacks a `RETURNS` clause. However, procedures can instead return data to their callers via output parameters.

* While a function is called as part of a query or DML command, a procedure is called in isolation using the [`CALL`](sql-call.html) command.

* A procedure can commit or roll back transactions during its execution (then automatically beginning a new transaction), so long as the invoking `CALL` command is not part of an explicit transaction block. A function cannot do that.

* Certain function attributes, such as strictness, don't apply to procedures. Those attributes control how the function is used in a query, which isn't relevant to procedures.

 The explanations in the following sections about how to define user-defined functions apply to procedures as well, except for the points made above.

 Collectively, functions and procedures are also known as *routines*[](). There are commands such as [`ALTER ROUTINE`](sql-alterroutine.html) and [`DROP ROUTINE`](sql-droproutine.html) that can operate on functions and procedures without having to know which kind it is. Note, however, that there is no `CREATE ROUTINE` command.

---

|     [Prev](xfunc.html)     |[Up](extend.html) |        [Next](xfunc-sql.html)       |
|:---------------------------|:----------------:|------------------------------------:|
|38.3. User-Defined Functions|[Home](index.html)| 38.5. Query Language (SQL) Functions|

 // \<![CDATA[ \<-- For SVG support if ('WebSocket' in window) { (function() { function refreshCSS() { var sheets = [].slice.call(document.getElementsByTagName("link")); var head = document.getElementsByTagName("head")[0]; for (var i = 0; i \< sheets.length; ++i) { var elem = sheets[i]; head.removeChild(elem); var rel = elem.rel; if (elem.href && typeof rel != "string" || rel.length == 0 || rel.toLowerCase() == "stylesheet") { var url = elem.href.replace(/(&|\\?)\_cacheOverride=\\d+/, ''); elem.href = url + (url.indexOf('?') \>= 0 ? '&' : '?') + '\_cacheOverride=' + (new Date().valueOf()); } head.appendChild(elem); } } var protocol = window.location.protocol === 'http:' ? 'ws://' : 'wss://'; var address = protocol + window.location.host + window.location.pathname + '/ws'; var socket = new WebSocket(address); socket.onmessage = function(msg) { if (msg.data == 'reload') window.location.reload(); else if (msg.data == 'refreshcss') refreshCSS(); }; console.log('Live reload enabled.'); })(); } // ]]\>