1
1
<!--
2
- $PostgreSQL: pgsql/doc/src/sgml/plperl.sgml,v 2.42 2005/07/13 02:10:42 neilc Exp $
2
+ $PostgreSQL: pgsql/doc/src/sgml/plperl.sgml,v 2.43 2005/08/12 21:42:53 momjian Exp $
3
3
-->
4
4
5
5
<chapter id="plperl">
@@ -46,7 +46,12 @@ $PostgreSQL: pgsql/doc/src/sgml/plperl.sgml,v 2.42 2005/07/13 02:10:42 neilc Exp
46
46
<para>
47
47
To create a function in the PL/Perl language, use the standard
48
48
<xref linkend="sql-createfunction" endterm="sql-createfunction-title">
49
- syntax:
49
+ syntax. A PL/Perl function must always return a scalar value. You
50
+ can return more complex structures (arrays, records, and sets)
51
+ in the appropriate context by returning a reference.
52
+ Never return a list. Here follows an example of a PL/Perl
53
+ function.
54
+
50
55
<programlisting>
51
56
CREATE FUNCTION <replaceable>funcname</replaceable> (<replaceable>argument-types</replaceable>) RETURNS <replaceable>return-type</replaceable> AS $$
52
57
# PL/Perl function body
@@ -282,7 +287,7 @@ SELECT * FROM perl_set();
282
287
</para>
283
288
284
289
<para>
285
- PL/Perl provides two additional Perl commands:
290
+ PL/Perl provides three additional Perl commands:
286
291
287
292
<variablelist>
288
293
<varlistentry>
@@ -293,11 +298,18 @@ SELECT * FROM perl_set();
293
298
294
299
<term><literal><function>spi_exec_query</>(<replaceable>query</replaceable> [, <replaceable>max-rows</replaceable>])</literal></term>
295
300
<term><literal><function>spi_exec_query</>(<replaceable>command</replaceable>)</literal></term>
301
+ <term><literal><function>spi_query</>(<replaceable>command</replaceable>)</literal></term>
302
+ <term><literal><function>spi_fetchrow</>(<replaceable>command</replaceable>)</literal></term>
303
+
296
304
<listitem>
297
305
<para>
298
- Executes an SQL command. Here is an example of a query
299
- (<command>SELECT</command> command) with the optional maximum
300
- number of rows:
306
+ <literal>spi_exec_query</literal> executes an SQL command and
307
+ returns the entire rowset as a reference to an array of hash
308
+ references. <emphasis>You should only use this command when you know
309
+ that the result set will be relatively small.</emphasis> Here is an
310
+ example of a query (<command>SELECT</command> command) with the
311
+ optional maximum number of rows:
312
+
301
313
<programlisting>
302
314
$rv = spi_exec_query('SELECT * FROM my_table', 5);
303
315
</programlisting>
@@ -345,7 +357,7 @@ INSERT INTO test (i, v) VALUES (2, 'second line');
345
357
INSERT INTO test (i, v) VALUES (3, 'third line');
346
358
INSERT INTO test (i, v) VALUES (4, 'immortal');
347
359
348
- CREATE FUNCTION test_munge() RETURNS SETOF test AS $$
360
+ CREATE OR REPLACE FUNCTION test_munge() RETURNS SETOF test AS $$
349
361
my $rv = spi_exec_query('select i, v from test;');
350
362
my $status = $rv->{status};
351
363
my $nrows = $rv->{processed};
@@ -360,7 +372,45 @@ $$ LANGUAGE plperl;
360
372
361
373
SELECT * FROM test_munge();
362
374
</programlisting>
363
- </para>
375
+ </para>
376
+ <para>
377
+ <literal>spi_query</literal> and <literal>spi_fetchrow</literal>
378
+ work together as a pair for rowsets which may be large, or for cases
379
+ where you wish to return rows as they arrive.
380
+ <literal>spi_fetchrow</literal> works <emphasis>only</emphasis> with
381
+ <literal>spi_query</literal>. The following example illustrates how
382
+ you use them together:
383
+
384
+ <programlisting>
385
+ CREATE TYPE foo_type AS (the_num INTEGER, the_text TEXT);
386
+
387
+ CREATE OR REPLACE FUNCTION lotsa_md5 (INTEGER) RETURNS SETOF foo_type AS $$
388
+ use Digest::MD5 qw(md5_hex);
389
+ my $file = '/usr/share/dict/words';
390
+ my $t = localtime;
391
+ elog(NOTICE, "opening file $file at $t" );
392
+ open my $fh, '<', $file # ooh, it's a file access!
393
+ or elog(ERROR, "Can't open $file for reading: $!");
394
+ my @words = <$fh>;
395
+ close $fh;
396
+ $t = localtime;
397
+ elog(NOTICE, "closed file $file at $t");
398
+ chomp(@words);
399
+ my $row;
400
+ my $sth = spi_query("SELECT * FROM generate_series(1,$_[0]) AS b(a)");
401
+ while (defined ($row = spi_fetchrow($sth))) {
402
+ return_next({
403
+ the_num => $row->{a},
404
+ the_text => md5_hex($words[rand @words])
405
+ });
406
+ }
407
+ return;
408
+ $$ LANGUAGE plperlu;
409
+
410
+ SELECT * from lotsa_md5(500);
411
+ </programlisting>
412
+ </para>
413
+
364
414
</listitem>
365
415
</varlistentry>
366
416
@@ -716,10 +766,20 @@ CREATE TRIGGER test_valid_id_trig
716
766
717
767
<listitem>
718
768
<para>
719
- In the current implementation, if you are fetching or returning
720
- very large data sets, you should be aware that these will all go
721
- into memory.
769
+ If you are fetching very large data sets using
770
+ <literal>spi_exec_query</literal>, you should be aware that
771
+ these will all go into memory. You can avoid this by using
772
+ <literal>spi_query</literal>/<literal>spi_fetchrow</literal> as
773
+ illustrated earlier.
774
+ </para>
775
+ <para>
776
+ A similar problem occurs if a set-returning function passes a
777
+ large set of rows back to postgres via <literal>return</literal>. You
778
+ can avoid this problem too by instead using
779
+ <literal>return_next</literal> for each row returned, as shown
780
+ previously.
722
781
</para>
782
+
723
783
</listitem>
724
784
</itemizedlist>
725
785
</para>
0 commit comments