Index: doc/src/sgml/plpgsql.sgml =================================================================== RCS file: /var/lib/cvs/pgsql-server/doc/src/sgml/plpgsql.sgml,v retrieving revision 1.12 diff -c -r1.12 plpgsql.sgml *** doc/src/sgml/plpgsql.sgml 23 Nov 2002 03:59:05 -0000 1.12 --- doc/src/sgml/plpgsql.sgml 10 Jan 2003 17:59:49 -0000 *************** *** 68,73 **** --- 68,74 ---- SQL expressions and SQL queries used in the function are not translated immediately. + As each expression and SQL query is first used in the function, the PL/pgSQL interpreter creates *************** *** 84,95 **** that errors in a specific expression or query may not be detected until that part of the function is reached in execution. ! ! Once PL/pgSQL has made a query plan for a particular ! query in a function, it will re-use that plan for the life of the ! database connection. This is usually a win for performance, but it ! can cause some problems if you dynamically ! alter your database schema. For example: CREATE FUNCTION populate() RETURNS INTEGER AS ' --- 85,97 ---- that errors in a specific expression or query may not be detected until that part of the function is reached in execution. ! ! ! Once PL/pgSQL has made a query plan for a particular ! query in a function, it will re-use that plan for the life of the ! database connection. This is usually a win for performance, but it ! can cause some problems if you dynamically ! alter your database schema. For example: CREATE FUNCTION populate() RETURNS INTEGER AS ' *************** *** 100,105 **** --- 102,108 ---- END; ' LANGUAGE 'plpgsql'; + If you execute the above function, it will reference the OID for my_function() in the query plan produced for the PERFORM statement. Later, if you *************** *** 107,113 **** populate() will not be able to find my_function() anymore. You would then have to re-create populate(), or at least start a new ! database session so that it will be compiled afresh. --- 110,120 ---- populate() will not be able to find my_function() anymore. You would then have to re-create populate(), or at least start a new ! database session so that it will be compiled afresh. Another way ! to avoid this problem is to use CREATE OR REPLACE ! FUNCTION when updating the definition of ! my_function (when a function is ! replaced, its OID is not changed). *************** *** 221,255 **** Developing in <application>PL/pgSQL</application> ! Developing in PL/pgSQL is pretty straight forward, especially ! if you have developed in other database procedural languages, ! such as Oracle's PL/SQL. Two good ways of developing in ! PL/pgSQL are: ! ! ! ! ! Using a text editor and reloading the file with psql ! ! ! ! ! ! Using PostgreSQL's GUI Tool: PgAccess ! ! ! ! ! ! ! One good way to develop in PL/pgSQL is to simply ! use the text editor of your choice to create your functions, and ! in another window, use psql ! (PostgreSQL's interactive monitor) to load those ! functions. If you are doing it this way, it is a good idea to ! write the function using CREATE OR REPLACE ! FUNCTION. That way you can reload the file to update the ! function definition. For example: CREATE OR REPLACE FUNCTION testfunc(INTEGER) RETURNS INTEGER AS ' .... --- 228,244 ---- Developing in <application>PL/pgSQL</application> ! Developing in PL/pgSQL is pretty ! straight forward, especially if you have developed in other ! database procedural languages, such as Oracle's ! PL/SQL. One good way to develop in ! PL/pgSQL is to simply use the text editor of your ! choice to create your functions, and in another window, use ! psql (PostgreSQL's interactive ! monitor) to load those functions. If you are doing it this way, it ! is a good idea to write the function using CREATE OR ! REPLACE FUNCTION. That way you can reload the file to update ! the function definition. For example: CREATE OR REPLACE FUNCTION testfunc(INTEGER) RETURNS INTEGER AS ' .... *************** *** 268,277 **** ! Another good way to develop in PL/pgSQL is using ! PostgreSQL's GUI tool: PgAccess. It does some ! nice things for you, like escaping single-quotes, and making ! it easy to recreate and debug functions. --- 257,268 ---- ! Another good way to develop in PL/pgSQL is using a ! GUI database access tool that facilitates development in a ! procedural language. One example of such as a tool is ! PgAccess, although others exist. These tools often ! provide convenient features such as escaping single-quotes, and ! making it easier to recreate and debug functions.