]> granicus.if.org Git - postgresql/blob - src/pl/plpgsql/src/expected/plpgsql_call.out
ab9d3bbc701fe41f9b9c8f4b750a127b11ea7c2d
[postgresql] / src / pl / plpgsql / src / expected / plpgsql_call.out
1 --
2 -- Tests for procedures / CALL syntax
3 --
4 CREATE PROCEDURE test_proc1()
5 LANGUAGE plpgsql
6 AS $$
7 BEGIN
8     NULL;
9 END;
10 $$;
11 CALL test_proc1();
12 -- error: can't return non-NULL
13 CREATE PROCEDURE test_proc2()
14 LANGUAGE plpgsql
15 AS $$
16 BEGIN
17     RETURN 5;
18 END;
19 $$;
20 ERROR:  RETURN cannot have a parameter in a procedure
21 LINE 5:     RETURN 5;
22                    ^
23 CREATE TABLE test1 (a int);
24 CREATE PROCEDURE test_proc3(x int)
25 LANGUAGE plpgsql
26 AS $$
27 BEGIN
28     INSERT INTO test1 VALUES (x);
29 END;
30 $$;
31 CALL test_proc3(55);
32 SELECT * FROM test1;
33  a  
34 ----
35  55
36 (1 row)
37
38 -- nested CALL
39 TRUNCATE TABLE test1;
40 CREATE PROCEDURE test_proc4(y int)
41 LANGUAGE plpgsql
42 AS $$
43 BEGIN
44     CALL test_proc3(y);
45     CALL test_proc3($1);
46 END;
47 $$;
48 CALL test_proc4(66);
49 SELECT * FROM test1;
50  a  
51 ----
52  66
53  66
54 (2 rows)
55
56 CALL test_proc4(66);
57 SELECT * FROM test1;
58  a  
59 ----
60  66
61  66
62  66
63  66
64 (4 rows)
65
66 -- output arguments
67 CREATE PROCEDURE test_proc5(INOUT a text)
68 LANGUAGE plpgsql
69 AS $$
70 BEGIN
71     a := a || '+' || a;
72 END;
73 $$;
74 CALL test_proc5('abc');
75     a    
76 ---------
77  abc+abc
78 (1 row)
79
80 CREATE PROCEDURE test_proc6(a int, INOUT b int, INOUT c int)
81 LANGUAGE plpgsql
82 AS $$
83 BEGIN
84     b := b * a;
85     c := c * a;
86 END;
87 $$;
88 CALL test_proc6(2, 3, 4);
89  b | c 
90 ---+---
91  6 | 8
92 (1 row)
93
94 DO
95 LANGUAGE plpgsql
96 $$
97 DECLARE
98     x int := 3;
99     y int := 4;
100 BEGIN
101     CALL test_proc6(2, x, y);
102     RAISE INFO 'x = %, y = %', x, y;
103 END;
104 $$;
105 INFO:  x = 6, y = 8
106 DO
107 LANGUAGE plpgsql
108 $$
109 DECLARE
110     x int := 3;
111     y int := 4;
112 BEGIN
113     CALL test_proc6(2, x + 1, y);  -- error
114     RAISE INFO 'x = %, y = %', x, y;
115 END;
116 $$;
117 ERROR:  argument 2 is an output argument but is not writable
118 CONTEXT:  PL/pgSQL function inline_code_block line 6 at CALL
119 DO
120 LANGUAGE plpgsql
121 $$
122 DECLARE
123     x int := 3;
124     y int := 4;
125 BEGIN
126     FOR i IN 1..5 LOOP
127         CALL test_proc6(i, x, y);
128         RAISE INFO 'x = %, y = %', x, y;
129     END LOOP;
130 END;
131 $$;
132 INFO:  x = 3, y = 4
133 INFO:  x = 6, y = 8
134 INFO:  x = 18, y = 24
135 INFO:  x = 72, y = 96
136 INFO:  x = 360, y = 480
137 -- recursive with output arguments
138 CREATE PROCEDURE test_proc7(x int, INOUT a int, INOUT b numeric)
139 LANGUAGE plpgsql
140 AS $$
141 BEGIN
142 IF x > 1 THEN
143     a := x / 10;
144     b := x / 2;
145     CALL test_proc7(b::int, a, b);
146 END IF;
147 END;
148 $$;
149 CALL test_proc7(100, -1, -1);
150  a | b 
151 ---+---
152  0 | 1
153 (1 row)
154
155 -- transition variable assignment
156 TRUNCATE test1;
157 CREATE FUNCTION triggerfunc1() RETURNS trigger
158 LANGUAGE plpgsql
159 AS $$
160 DECLARE
161     z int := 0;
162 BEGIN
163     CALL test_proc6(2, NEW.a, NEW.a);
164     RETURN NEW;
165 END;
166 $$;
167 CREATE TRIGGER t1 BEFORE INSERT ON test1 EXECUTE PROCEDURE triggerfunc1();
168 INSERT INTO test1 VALUES (1), (2), (3);
169 UPDATE test1 SET a = 22 WHERE a = 2;
170 SELECT * FROM test1 ORDER BY a;
171  a  
172 ----
173   1
174   3
175  22
176 (3 rows)
177
178 DROP PROCEDURE test_proc1;
179 DROP PROCEDURE test_proc3;
180 DROP PROCEDURE test_proc4;
181 DROP TABLE test1;