Crear procedimientos ofuscados utilizando un procedimiento encapsulado

Una manera frecuente de crear un procedimiento almacenado ofuscado es creando un “derivador” de procedimiento almacenado que tome la definición y el cuerpo del procedimiento y cree el procedimiento ofuscado, como en el ejemplo siguiente:

TEST.TESTSCH(USR)=> CREATE OR REPLACE PROCEDURE wrap_proc(text, text)
RETURNS BOOL LANGUAGE NZPLSQL AS 
BEGIN_PROC
  DECLARE
    proc alias for $1;
    body alias for $2;
    enc text;
    sql text;
    BEGIN
      enc := wrap_nzplsql(body);
      sql := proc || '' || '' || quote_literal(enc) || '';
      RAISE NOTICE '%;', sql;
      EXECUTE IMMEDIATE sql;
      return true;
    END;
END_PROC;
CREATE PROCEDURE
Llame al procedimiento wrap_proc() y especifique la definición principal de CREATE OR REPLACE en el primer valor de entrada; a continuación, especifique el contenido de BEGIN PROC/END PROC en el segundo valor de entrada. Debe escribir la definición principal (el primer valor de entrada) entre comillas simples. No escriba el segundo valor de entrada (el cuerpo de procedimiento) entre comillas simples porque el procedimiento incorporado wrap_nzplsql() toma el texto como si se hubiera especificado para un mandato CREATE OR REPLACE PROCEDURE. A continuación se ofrece un ejemplo:
TEST.TESTSCH(USR)=> CALL wrap_proc('CREATE OR REPLACE PROCEDURE customer() 
RETURNS INT4 LANGUAGE NZPLSQL AS', 
BEGIN_PROC
    BEGIN
        RAISE NOTICE 'The customer name is alpha';
    END;
END_PROC);
NOTICE:  CREATE OR REPLACE PROCEDURE customer() RETURNS INT4 LANGUAGE 
NZPLSQL 
AS'TlpQU1FMV1JBUDEwWWk5NUhrQzVhR0xyRFRxTWR3VE5sQT09JEdFQ1B5LzVkSU1KMTI
1a0dUK3NTWjlkb3ZGL3ZHalhpVExPVG5UajRkK3gxSkxvZVhKejdZQmJOVHN0aU1waFRlb
mhoaWtYdHJUTVkKUUNrWDY5Nko5Rms2NlBIYUxra21xeWNZYXdWclBCQT0=';
 wrap_proc
-----------
 t
(1 row)
Al llamar a un procedimiento ofuscado, el sistema utiliza rutinas internas para “leer” el texto de cuerpo ofuscado y ejecutar el procedimiento. El comportamiento y la salida del procedimiento ofuscado es idéntico a una versión de texto simple del procedimiento, por ejemplo:
TEST.TESTSCH(USR)=> CALL customer();
NOTICE:  The customer name is alpha
 customer
----------
(1 row)