By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,952 Members | 959 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,952 IT Pros & Developers. It's quick & easy.

Convert a 'pltcl' function to 'plpgsql' function (postgresql)

P: 1
I have been researching for days about the diff. between pltcl and plpgsql language in postgresql to solve my problem.

I have created a trigger function in 'pltcl' language but now I am trying to convert this in 'plpgsql' language. Any idea on how to convert this piece of trigger function code to plpgsql function? Thanks

Expand|Select|Wrap|Line Numbers
  1. CREATE OR REPLACE FUNCTION "public"."audit_log" () RETURNS trigger AS
  2.     $body$
  3.     spi_exec "SELECT CURRENT_USER AS tguser"
  4.     spi_exec "SELECT relname AS tgname FROM pg_class WHERE relfilenode = $TG_relid"
  5.  
  6.     #skip changes on audit_table
  7.     if {[string equal -nocase $tgname audit_table]} { return OK }
  8.  
  9.     #get PK name
  10.     set pk_name ""
  11.     spi_exec "SELECT a.attname AS pk_name FROM pg_class c, pg_attribute a, pg_index i
  12.      WHERE c.relname = '$tgname'
  13.      AND c.oid=i.indrelid
  14.      AND a.attnum > 0
  15.      AND a.attrelid = i.indexrelid
  16.      AND i.indisprimary='t'"
  17.  
  18.     switch $TG_op {
  19.     INSERT {
  20.       set pk_value ""
  21.  
  22.       #get PK value
  23.       foreach field $TG_relatts {
  24.         if {[string equal -nocase [lindex [array get NEW $field] 0] $pk_name]} {
  25.           set pk_value [lindex [array get NEW $field] 1]
  26.           break;
  27.         }
  28.       }
  29.       #log inserted row values
  30.       foreach field $TG_relatts {
  31.         if {! [string equal -nocase [lindex [array get NEW $field] 0] $pk_name]} {
  32.           set modified_field [lindex [array get NEW $field] 0]
  33.  
  34.          if {[string compare $modified_field ""] != 0} {
  35.  
  36.           set current_value [lindex [array get NEW $field] 1]
  37.           spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, pk_name, pk_value, mod_type, old_val, new_val)
  38.             VALUES (CURRENT_TIMESTAMP, '[ quote $tguser ]', '[ quote $tgname ]', '[ quote $modified_field ]', '[ quote $pk_name ]', '[ quote $pk_value ]', '$TG_op', NULL, '[ quote $current_value ]')"
  39.           }
  40.         }
  41.       }
  42.     }
  43.     UPDATE {
  44.       set pk_value ""
  45.  
  46.       #get PK value
  47.       foreach field $TG_relatts {
  48.         if {[string equal -nocase [lindex [array get NEW $field] 0] $pk_name]} {
  49.           set pk_value [lindex [array get NEW $field] 1]
  50.           break;
  51.         }
  52.       }
  53.       #log inserted row values
  54.       foreach field $TG_relatts {
  55.         #check changed fields
  56.         if {[string equal -nocase [array get NEW $field] [array get OLD $field]] == 0} {
  57.           set modified_field [lindex [array get OLD $field] 0]
  58.           if {[string compare $modified_field ""] == 0} {
  59.             set modified_field [lindex  [array get NEW $field] 0]
  60.           }
  61.           set previous_value [lindex [array get OLD $field] 1]
  62.           set current_value  [lindex [array get NEW $field] 1]
  63.           spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, pk_name, pk_value, mod_type, old_val, new_val)
  64.             VALUES (CURRENT_TIMESTAMP, '[ quote $tguser ]', '[ quote $tgname ]', '[ quote $modified_field ]', '[ quote $pk_name ]', '[ quote $pk_value ]', '$TG_op', '[ quote $previous_value ]', '[ quote $current_value ]')"
  65.         }
  66.       }
  67.     }
  68.     DELETE {
  69.       set pk_value ""
  70.  
  71.       #get PK value
  72.       foreach field $TG_relatts {
  73.         if {[string equal -nocase [lindex [array get OLD $field] 0] $pk_name]} {
  74.           set pk_value [lindex [array get OLD $field] 1]
  75.           break;
  76.         }
  77.       }
  78.       #log inserted row values
  79.       foreach field $TG_relatts {
  80.         if {! [string equal -nocase [lindex [array get OLD $field] 0] $pk_name]} {
  81.           set modified_field [lindex [array get OLD $field] 0]
  82.           set previous_value [lindex [array get OLD $field] 1]
  83.           spi_exec -array C "INSERT INTO audit_table(ts, usr, tbl, fld, pk_name, pk_value, mod_type, old_val, new_val)
  84.             VALUES (CURRENT_TIMESTAMP, '[ quote $tguser ]', '[ quote $tgname ]', '[ quote $modified_field ]', '[ quote $pk_name ]', '[ quote $pk_value ]', '$TG_op', '[ quote $previous_value ]', NULL)"
  85.         }
  86.       }
  87.     }
  88.     }
  89.     return OK
  90.     $body$
  91. LANGUAGE 'pltcl' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
Jul 16 '15 #1
Share this question for a faster answer!
Share on Google+

Post your reply

Sign in to post your reply or Sign up for a free account.