mirror of
https://github.com/postgres/postgres.git
synced 2025-07-20 05:03:10 +03:00
Support INOUT arguments in procedures
In a top-level CALL, the values of INOUT arguments will be returned as a result row. In PL/pgSQL, the values are assigned back to the input arguments. In other languages, the same convention as for return a record from a function is used. That does not require any code changes in the PL implementations. Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com>
This commit is contained in:
@ -71,6 +71,26 @@ SELECT * FROM cp_test;
|
||||
1 | b
|
||||
(2 rows)
|
||||
|
||||
-- output arguments
|
||||
CREATE PROCEDURE ptest4a(INOUT a int, INOUT b int)
|
||||
LANGUAGE SQL
|
||||
AS $$
|
||||
SELECT 1, 2;
|
||||
$$;
|
||||
CALL ptest4a(NULL, NULL);
|
||||
a | b
|
||||
---+---
|
||||
1 | 2
|
||||
(1 row)
|
||||
|
||||
CREATE PROCEDURE ptest4b(INOUT b int, INOUT a int)
|
||||
LANGUAGE SQL
|
||||
AS $$
|
||||
CALL ptest4a(a, b); -- error, not supported
|
||||
$$;
|
||||
ERROR: calling procedures with output arguments is not supported in SQL functions
|
||||
CONTEXT: SQL function "ptest4b"
|
||||
DROP PROCEDURE ptest4a;
|
||||
-- various error cases
|
||||
CALL version(); -- error: not a procedure
|
||||
ERROR: version() is not a procedure
|
||||
@ -90,7 +110,8 @@ ERROR: invalid attribute in procedure definition
|
||||
LINE 1: CREATE PROCEDURE ptestx() LANGUAGE SQL STRICT AS $$ INSERT I...
|
||||
^
|
||||
CREATE PROCEDURE ptestx(OUT a int) LANGUAGE SQL AS $$ INSERT INTO cp_test VALUES (1, 'a') $$;
|
||||
ERROR: procedures cannot have OUT parameters
|
||||
ERROR: procedures cannot have OUT arguments
|
||||
HINT: INOUT arguments are permitted.
|
||||
ALTER PROCEDURE ptest1(text) STRICT;
|
||||
ERROR: invalid attribute in procedure definition
|
||||
LINE 1: ALTER PROCEDURE ptest1(text) STRICT;
|
||||
|
@ -46,6 +46,25 @@ CALL ptest3('b');
|
||||
SELECT * FROM cp_test;
|
||||
|
||||
|
||||
-- output arguments
|
||||
|
||||
CREATE PROCEDURE ptest4a(INOUT a int, INOUT b int)
|
||||
LANGUAGE SQL
|
||||
AS $$
|
||||
SELECT 1, 2;
|
||||
$$;
|
||||
|
||||
CALL ptest4a(NULL, NULL);
|
||||
|
||||
CREATE PROCEDURE ptest4b(INOUT b int, INOUT a int)
|
||||
LANGUAGE SQL
|
||||
AS $$
|
||||
CALL ptest4a(a, b); -- error, not supported
|
||||
$$;
|
||||
|
||||
DROP PROCEDURE ptest4a;
|
||||
|
||||
|
||||
-- various error cases
|
||||
|
||||
CALL version(); -- error: not a procedure
|
||||
|
Reference in New Issue
Block a user