Thread: Opening view that uses a function - empty column

Opening view that uses a function - empty column

From
Brady Mathis
Date:
Two step inquiry:


1)  I have created a function that will parse a value out of XML stored in the pg_largeobject table using xpath, like
so:


CREATE OR REPLACE FUNCTION extract_from_extended(text, bigint)
  RETURNS text AS
$BODY$
    select translate( xpath(...) );
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;


2)  I then created a view that calls this function as part of the query, like so:


CREATE OR REPLACE VIEW encounter AS
SELECT md.account_id, extract_from_extended('externalEncounterID'::text, md.id) AS external_id...
    FROM app.menu_data md, app.menu_structure ms
    WHERE...;

When I open this view via JDBC, there is no data in the column that is filled by the function call.

Any thoughts?
TIA,
BRady

Re: Opening view that uses a function - empty column

From
Dave Cramer
Date:
You'd have to give us a bit more information such as how you "open" it
using JDBC

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca


On Fri, Jul 27, 2012 at 3:46 PM, Brady Mathis <bmathis@r-hsoftware.com> wrote:
> Two step inquiry:
>
>
> 1)  I have created a function that will parse a value out of XML stored in the pg_largeobject table using xpath, like
so:
>
>
> CREATE OR REPLACE FUNCTION extract_from_extended(text, bigint)
>   RETURNS text AS
> $BODY$
>         select translate( xpath(...) );
> $BODY$
>   LANGUAGE sql VOLATILE
>   COST 100;
>
>
> 2)  I then created a view that calls this function as part of the query, like so:
>
>
> CREATE OR REPLACE VIEW encounter AS
> SELECT md.account_id, extract_from_extended('externalEncounterID'::text, md.id) AS external_id...
>         FROM app.menu_data md, app.menu_structure ms
>         WHERE...;
>
> When I open this view via JDBC, there is no data in the column that is filled by the function call.
>
> Any thoughts?
> TIA,
> BRady
>
> --
> Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-jdbc

Re: Opening view that uses a function - empty column

From
Brady Mathis
Date:
I am actually using Jasper reports to access the view.  I created the data source and specified the following:

Driver:  org.postgresql.Driver
URL:  jdbc:postgresql://localhost:5432/postgres
UID and PW

I made sure to update to postgresql-9.1-902.jdbc4.jar (PG version is 9.1.2)

Then I defined a query simply as:

select * from encounter;

I also tried the same query using a SquirrelSQL client (just to eliminate a problem in Jasper) and got the same result.
The column filled by the function is empty. 

If I select * from encounter directly in postgres, the column is filled.

My apologies if I haven't included the implementation details that you need.

Thanks!

Re: Opening view that uses a function - empty column

From
David Johnston
Date:
On Jul 27, 2012, at 17:21, Brady Mathis <bmathis@r-hsoftware.com> wrote:

> I am actually using Jasper reports to access the view.  I created the data source and specified the following:
>
> Driver:  org.postgresql.Driver
> URL:  jdbc:postgresql://localhost:5432/postgres
> UID and PW
>
> I made sure to update to postgresql-9.1-902.jdbc4.jar (PG version is 9.1.2)
>
> Then I defined a query simply as:
>
> select * from encounter;
>
> I also tried the same query using a SquirrelSQL client (just to eliminate a problem in Jasper) and got the same
result. The column filled by the function is empty. 
>
> If I select * from encounter directly in postgres, the column is filled.
>
> My apologies if I haven't included the implementation details that you need.
>
> Thanks!
>

Is the same user being used in both cases and are there any other functions with the same name but in other schemas?

David J.

Re: Opening view that uses a function - empty column

From
Brady Mathis
Date:
Oh!  And, I made another observation while cracking away at this:  When I connect to the DB using PGAdmin (1.14.3) from
aremote workstation as opposed to on the DB server itself, I see the same problem with the empty external_id column
whenexecuting "select * from rhs.encounter;". 

Could this be a problem with how I have implemented my functions?  There are two  functions calls actually used to fill
thecolumn - I included the complete text of the functions below. 

get_valid_xml - ensures that content from pg_largeobject is valid xml
extract_from_extended - uses xmlparse and xpath to get one specific value

Thanks...again!

/* Function to validate xml for xpath use in SQL query */
CREATE OR REPLACE FUNCTION rhs.get_valid_xml(x text)
  RETURNS xml AS
$BODY$
BEGIN
    PERFORM XMLPARSE( DOCUMENT x );
        RETURN XMLPARSE( DOCUMENT x );
    EXCEPTION WHEN OTHERS THEN
        RETURN XMLPARSE( DOCUMENT '<?xml version="1.0" encoding="UTF-8"?><fields></fields>' );
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION rhs.get_valid_xml(text) OWNER TO postgres;


/* Function to allow extract of fields from _extended */
CREATE OR REPLACE FUNCTION rhs.extract_from_extended(field_name text, menu_data_id bigint)
  RETURNS text AS
$BODY$
    select translate( xpath('//field[@name="'||$1||'" and @type="String"]/text()', xmlparse(document (
rhs.get_valid_xml(array_to_string( array(select lo.data from app.menu_data md, pg_catalog.pg_largeobject lo where md.id
=$2 and  md.xml01 = lo.loid), '') ) )))::text, '{}', ''); 
$BODY$
  LANGUAGE sql VOLATILE
  COST 100;
ALTER FUNCTION rhs.extract_from_extended(text, bigint) OWNER TO postgres;




On Friday, July 27, 2012 1:46:20 PM UTC-6, Brady Mathis wrote:
> Two step inquiry:
>
>
>
>
>
> 1)  I have created a function that will parse a value out of XML stored in the pg_largeobject table using xpath, like
so:
>
>
>
>
>
> CREATE OR REPLACE FUNCTION extract_from_extended(text, bigint)
>
>   RETURNS text AS
>
> $BODY$
>
>     select translate( xpath(...) );
>
> $BODY$
>
>   LANGUAGE sql VOLATILE
>
>   COST 100;
>
>
>
>
>
> 2)  I then created a view that calls this function as part of the query, like so:
>
>
>
>
>
> CREATE OR REPLACE VIEW encounter AS
>
> SELECT md.account_id, extract_from_extended('externalEncounterID'::text, md.id) AS external_id...
>
>     FROM app.menu_data md, app.menu_structure ms
>
>     WHERE...;
>
>
>
> When I open this view via JDBC, there is no data in the column that is filled by the function call.
>
>
>
> Any thoughts?
>
> TIA,
>
> BRady

Re: Opening view that uses a function - empty column

From
Brady Mathis
Date:
Thanks for your replies.

David J. - Yes, the same User/PW is used to access, and no, there aren't any other functions in other schemas.

I wrote some simple java code to test the issue (below).  The connection works and the table rows are returned, but the
external_idcolumn (filled by the function) is not populated. 


    public class testconn {
        public static void main(String[] argv) {

            try {
                    Class.forName("org.postgresql.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                return;
            }
            Connection connection = null;
            try {
                String url = "jdbc:postgresql://localhost:5432/postgres";
                Properties props = new Properties();
                props.setProperty("user","postgres");
                props.setProperty("password","postgres");
                connection = DriverManager.getConnection(url, props);
            } catch (SQLException e) {
                e.printStackTrace();
                return;
            }
            try {
                Statement st = connection.createStatement();
                ResultSet rs = st.executeQuery("SELECT external_id FROM rhs.encounter");
                while (rs.next()) {
                    System.out.println(rs.getString(1));
                }
                rs.close();
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

}

Thanks,
Brady

On Friday, July 27, 2012 1:46:20 PM UTC-6, Brady Mathis wrote:
> Two step inquiry:
>
>
>
>
>
> 1)  I have created a function that will parse a value out of XML stored in the pg_largeobject table using xpath, like
so:
>
>
>
>
>
> CREATE OR REPLACE FUNCTION extract_from_extended(text, bigint)
>
>   RETURNS text AS
>
> $BODY$
>
>     select translate( xpath(...) );
>
> $BODY$
>
>   LANGUAGE sql VOLATILE
>
>   COST 100;
>
>
>
>
>
> 2)  I then created a view that calls this function as part of the query, like so:
>
>
>
>
>
> CREATE OR REPLACE VIEW encounter AS
>
> SELECT md.account_id, extract_from_extended('externalEncounterID'::text, md.id) AS external_id...
>
>     FROM app.menu_data md, app.menu_structure ms
>
>     WHERE...;
>
>
>
> When I open this view via JDBC, there is no data in the column that is filled by the function call.
>
>
>
> Any thoughts?
>
> TIA,
>
> BRady

Re: Opening view that uses a function - empty column

From
"David Johnston"
Date:
Couple of points - though they won't help the current question probably:

>Brady's original
---------------my responses embedded


> -----Original Message-----
> From: pgsql-jdbc-owner@postgresql.org [mailto:pgsql-jdbc-
> owner@postgresql.org] On Behalf Of Brady Mathis
> Sent: Monday, July 30, 2012 1:38 PM
> To: pgsql-jdbc@postgresql.org
> Subject: Re: [JDBC] Opening view that uses a function - empty column
>
> Oh!  And, I made another observation while cracking away at this:  When I
> connect to the DB using PGAdmin (1.14.3) from a remote workstation as
> opposed to on the DB server itself, I see the same problem with the empty
> external_id column when executing "select * from rhs.encounter;".

----------------Are you sure that when you connect to the server from
"...the DB server itself" you are connecting to the same database as when
you do so remotely?

----------------This really feels like an identity issue and not anything
specifically related to the code you are showing us.  That said...see below.

>
> Could this be a problem with how I have implemented my functions?  There
> are two  functions calls actually used to fill the column - I included the
> complete text of the functions below.
>
> get_valid_xml - ensures that content from pg_largeobject is valid xml
> extract_from_extended - uses xmlparse and xpath to get one specific value
>
> Thanks...again!
>
> /* Function to validate xml for xpath use in SQL query */ CREATE OR
REPLACE
> FUNCTION rhs.get_valid_xml(x text)
>   RETURNS xml AS
> $BODY$
> BEGIN
>     PERFORM XMLPARSE( DOCUMENT x );
>         RETURN XMLPARSE( DOCUMENT x );

------------It is unnecessary to call XMLPARSE twice, especially since you
are doing so on the "no exception" code path.

>     EXCEPTION WHEN OTHERS THEN
>         RETURN XMLPARSE( DOCUMENT '<?xml version="1.0"
> encoding="UTF-8"?><fields></fields>' ); END; $BODY$


------------Whenever you are having difficulties you should avoid ignoring
exceptions.  At worse perform a RAISE NOTICE when one occurs it you still
want to send back an empty document.  However, raising the exception is also
a valid and useful action.  If you are debugging then raising an exception
(and reviewing it) is even more worthwhile.


>   LANGUAGE plpgsql VOLATILE
>   COST 100;
> ALTER FUNCTION rhs.get_valid_xml(text) OWNER TO postgres;
>
>
> /* Function to allow extract of fields from _extended */ CREATE OR REPLACE
> FUNCTION rhs.extract_from_extended(field_name text, menu_data_id
> bigint)
>   RETURNS text AS
> $BODY$
>     select translate( xpath('//field[@name="'||$1||'" and
> @type="String"]/text()', xmlparse(document ( rhs.get_valid_xml(
> array_to_string( array(select lo.data from app.menu_data md,
> pg_catalog.pg_largeobject lo where md.id = $2 and  md.xml01 = lo.loid),
'') )
> )))::text, '{}', ''); $BODY$


------------Here you call XMLParse/Document on the result of
"get_valid_xml(...)";  this seems redundant since "get_valid_xml(...)"
already does this.


>   LANGUAGE sql VOLATILE
>   COST 100;
> ALTER FUNCTION rhs.extract_from_extended(text, bigint) OWNER TO
> postgres;





Re: Opening view that uses a function - empty column

From
Brady Mathis
Date:
David J -

Thanks for the pointers.  I'm sure you can tell that these are (nearly) the first PG procedures that I have written.  I
didthe suggested refactoring. 

Could you elaborate a little on the "identity" problem?
There is only one set of schemas on the server against which I am testing.  I am using the same credentials to log in
viaPGAdmin (local and remote) and Java. 
The only non-default configuration I have for PG (that I can think of now) are a few entries in pg_hba.conf as follows:
host    all             all             127.0.0.1/32            md5
host    postgres        postgres        173.20.10.3/32          md5
hostssl    postgres    postgres    127.0.0.1/32        md5
hostssl postgres        postgres        173.20.10.3/32          md5

I appreciate all your help,
Brady

On Monday, July 30, 2012 2:22:04 PM UTC-6, "David Johnston" wrote:
> Couple of points - though they won't help the current question probably:
>
>
>
> >Brady's original
>
> ---------------my responses embedded
>
>
>
>
>
> > -----Original Message-----
>
> > From: pgsql-jdbc-owner@postgresql.org [mailto:pgsql-jdbc-
>
> > owner@postgresql.org] On Behalf Of Brady Mathis
>
> > Sent: Monday, July 30, 2012 1:38 PM
>
> > To: pgsql-jdbc@postgresql.org
>
> > Subject: Re: [JDBC] Opening view that uses a function - empty column
>
> >
>
> > Oh!  And, I made another observation while cracking away at this:  When I
>
> > connect to the DB using PGAdmin (1.14.3) from a remote workstation as
>
> > opposed to on the DB server itself, I see the same problem with the empty
>
> > external_id column when executing "select * from rhs.encounter;".
>
>
>
> ----------------Are you sure that when you connect to the server from
>
> "...the DB server itself" you are connecting to the same database as when
>
> you do so remotely?
>
>
>
> ----------------This really feels like an identity issue and not anything
>
> specifically related to the code you are showing us.  That said...see below.
>
>
>
> >
>
> > Could this be a problem with how I have implemented my functions?  There
>
> > are two  functions calls actually used to fill the column - I included the
>
> > complete text of the functions below.
>
> >
>
> > get_valid_xml - ensures that content from pg_largeobject is valid xml
>
> > extract_from_extended - uses xmlparse and xpath to get one specific value
>
> >
>
> > Thanks...again!
>
> >
>
> > /* Function to validate xml for xpath use in SQL query */ CREATE OR
>
> REPLACE
>
> > FUNCTION rhs.get_valid_xml(x text)
>
> >   RETURNS xml AS
>
> > $BODY$
>
> > BEGIN
>
> >     PERFORM XMLPARSE( DOCUMENT x );
>
> >         RETURN XMLPARSE( DOCUMENT x );
>
>
>
> ------------It is unnecessary to call XMLPARSE twice, especially since you
>
> are doing so on the "no exception" code path.
>
>
>
> >     EXCEPTION WHEN OTHERS THEN
>
> >         RETURN XMLPARSE( DOCUMENT '<?xml version="1.0"
>
> > encoding="UTF-8"?><fields></fields>' ); END; $BODY$
>
>
>
>
>
> ------------Whenever you are having difficulties you should avoid ignoring
>
> exceptions.  At worse perform a RAISE NOTICE when one occurs it you still
>
> want to send back an empty document.  However, raising the exception is also
>
> a valid and useful action.  If you are debugging then raising an exception
>
> (and reviewing it) is even more worthwhile.
>
>
>
>
>
> >   LANGUAGE plpgsql VOLATILE
>
> >   COST 100;
>
> > ALTER FUNCTION rhs.get_valid_xml(text) OWNER TO postgres;
>
> >
>
> >
>
> > /* Function to allow extract of fields from _extended */ CREATE OR REPLACE
>
> > FUNCTION rhs.extract_from_extended(field_name text, menu_data_id
>
> > bigint)
>
> >   RETURNS text AS
>
> > $BODY$
>
> >     select translate( xpath('//field[@name="'||$1||'" and
>
> > @type="String"]/text()', xmlparse(document ( rhs.get_valid_xml(
>
> > array_to_string( array(select lo.data from app.menu_data md,
>
> > pg_catalog.pg_largeobject lo where md.id = $2 and  md.xml01 = lo.loid),
>
> '') )
>
> > )))::text, '{}', ''); $BODY$
>
>
>
>
>
> ------------Here you call XMLParse/Document on the result of
>
> "get_valid_xml(...)";  this seems redundant since "get_valid_xml(...)"
>
> already does this.
>
>
>
>
>
> >   LANGUAGE sql VOLATILE
>
> >   COST 100;
>
> > ALTER FUNCTION rhs.extract_from_extended(text, bigint) OWNER TO
>
> > postgres;
>
>
>
>
>
>
>
>
>
>
>
> --
>
> Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
>
> To make changes to your subscription:
>
> http://www.postgresql.org/mailpref/pgsql-jdbc