Global Values in PL/Perl
- You can use the global hash %_SHARED to store
- data between function calls. For example:
+ You can use the global hash %_SHARED to store
+ data, including code references, between function calls for the
+ lifetime of the current session, which is bounded from below by
+ the lifetime of the current transaction.
+
+
+ Here is a simple example for shared data:
CREATE OR REPLACE FUNCTION set_var(name text, val text) RETURNS text AS $$
if ($_SHARED{$_[0]} = $_[1]) {
SELECT get_var('sample');
+
+ Here is a slightly more complicated example using a code reference:
+
+CREATE OR REPLACE FUNCTION myfuncs() RETURNS void AS $$
+ $_SHARED{myquote} = sub {
+ my $arg = shift;
+ $arg =~ s/(['\\])/\\$1/g;
+ return "'$arg'";
+ };
+$$ LANGUAGE plperl;
+
+SELECT myfuncs(); /* initializes the function */
+
+/* Set up a function that uses the quote function */
+
+CREATE OR REPLACE FUNCTION use_quote(TEXT) RETURNS text AS $$
+ my $text_to_quote = shift;
+ my $qfunc = $_SHARED{myquote};
+ return &$qfunc($text_to_quote);
+$$ LANGUAGE plperl;
+
+
+ (You could have replaced the above with the one-liner
+ return $_SHARED{myquote}->($_[0]);
+ at the expense of readability.)
+