<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=SQL%2FPSM</id>
	<title>SQL/PSM - Historie editací</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/index.php?action=history&amp;feed=atom&amp;title=SQL%2FPSM"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=SQL/PSM&amp;action=history"/>
	<updated>2026-05-12T22:40:42Z</updated>
	<subtitle>Historie editací této stránky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=SQL/PSM&amp;diff=215&amp;oldid=prev</id>
		<title>imported&gt;WikiSysop: /* Difference from PL/pgSQL */</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=SQL/PSM&amp;diff=215&amp;oldid=prev"/>
		<updated>2007-11-04T20:43:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Difference from PL/pgSQL&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nová stránka&lt;/b&gt;&lt;/p&gt;&lt;div&gt;SQL/PSM is a mystic language without any information.  The bible is ISO/IEC 9075-4. Its first name was only PSM, next PSM-92, PSM-96 and then SQL/PSM. Older versions are incompatible with SQL/PSM.  The author of SQL/PSM is propably Jim Melton. Some RDBMS implements some subset of SQL/PSM. Famous is the implementation in DB2. I don&amp;#039;t know why, but the paradise of SQL/PSM is Sweden. SQL/PSM is implemented in Mimer, Solid, MySQL. You can find SQL/PSM suppport in daffodildb too. SQL/PSM support Czech 602SQL Server RDBMS too. OOD system Matisse use SQL/PSM language for objects’ methods. Manual in Czech [[Příručka SQL/PSM]] or English language — [[SQL/PSM Manual]].&lt;br /&gt;
&lt;br /&gt;
=== SQL/PSM is supported ===&lt;br /&gt;
* IBM DB2&lt;br /&gt;
* MySQL (version 5.0 and higher),&lt;br /&gt;
* Solid&lt;br /&gt;
* Mimer&lt;br /&gt;
* Sybase iAnywhere (Advantage Database Server 8.0, November 2005), http://www.extendedsystems.nl/web/content.aspx?key=F7144BCC5E1B10699707CC72D9B4A3C8&lt;br /&gt;
* 602SQL server&lt;br /&gt;
* Daffodil DB http://www.daffodildb.com/daffodildb-psm.html&lt;br /&gt;
* ElevateDB&lt;br /&gt;
&lt;br /&gt;
== SQL/PSM support in PostgreSQL ==&lt;br /&gt;
PL/pgPSM is based on the syntax of SQL/PSM (SQL:2003) with some differences. Current version isn&amp;#039;t usable for production. Main goals are education and collecting information about SQL/PSM now. This version is based on the PL/pgSQL interpreter (with modified syntax parser&amp;#039;s part for SQL/PSM). Currently this project is external and a little bit independent of core PostgreSQL. You can find it on [http://pgfoundry.org/projects/plpsm/ pgFoundry]. Hackers would prefer to completely rewrite PL interpreter (the source code is a little bit dirty), but I believe some work on the PL API is needed before this rewrite. Current PL runtime is fast and well tested.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Discussions from PostgreSQL Hackers archive ===&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2005-06/msg01467.php&lt;br /&gt;
* http://archives.postgresql.org/pgsql-hackers/2005-06/msg01466.php&lt;br /&gt;
&lt;br /&gt;
=== Questions ===&lt;br /&gt;
* which stmts signal NOT FOUND (??DELETE??)&lt;br /&gt;
&lt;br /&gt;
=== Difference from std. ===&lt;br /&gt;
* PLpgPSM don&amp;#039;t support procedures (and unbounded SELECTs ??is part of std??),&lt;br /&gt;
* &amp;lt;strike&amp;gt;for SRF is supported RETURN NEXT&amp;lt;/strike&amp;gt; table expression is supported,&lt;br /&gt;
* every not VOID or with OUT params function have to finish with RETURN,&lt;br /&gt;
* default for SQL/PSM is SECURE DEFINER (SECURE CALLER in PostgreSQL),&lt;br /&gt;
* dynamic SQL EXECUTE IMMEDIATE INTO (db2)&lt;br /&gt;
* SELECT INTO variables columns ... (PL/pgSQL) .. is correct (from notes to ISO is implementation depend),&lt;br /&gt;
* PERFORM (will be replaced CALL statement),&lt;br /&gt;
* Signal parameters (condition information item name) add DETAIL, &amp;lt;strike&amp;gt;LEVEL&amp;lt;/strike&amp;gt;, HINT (from PostgreSQL), originally only MESSAGE_TEXT, isn&amp;#039;t possible signal &amp;#039;00000&amp;#039; (and possible trapp it),&lt;br /&gt;
* for debug output statement PRINT.&lt;br /&gt;
* &amp;lt;i&amp;gt;CONTINUE HANDLER is fast for warnings; if it&amp;#039;s used for EXCEPTION is slow (every statement generate savepoint)&amp;lt;/i&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;&amp;lt;i&amp;gt;EXIT handler is prohibited for exception (allowed for warnings), only UNDO handler with BEGIN ATOMIC block is allowed&amp;lt;/i&amp;gt;&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* PostgreSQL use different set of function&amp;#039;s attributes &lt;br /&gt;
** DETERMINISTIC ~ IMMUTABLE, NON DETERMINISTIC ~ VOLATILE, &lt;br /&gt;
** SQL, NO SQL ~ no relevant PostgreSQL attributes,&lt;br /&gt;
* EXECUTE [INTO varlist] [USING varlist],&lt;br /&gt;
* &amp;lt;strike&amp;gt;NULL statement, .. do nothing&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* refcursor (from plpgsql), missing support WITH HOLD, WITH RETURN cursors,&lt;br /&gt;
* supported unbounded (refcursors) OPEN name FOR ... (from plpgsql),&lt;br /&gt;
* &amp;lt;strike&amp;gt;attr NO SCROLL isn&amp;#039;t supported (is implicit)&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* support SQLSTATE variable (from DB2)&lt;br /&gt;
&lt;br /&gt;
=== Diff from MySQL SQL/PSM language ===&lt;br /&gt;
* &amp;lt;b&amp;gt;unsupported unbound SELECT statements,&amp;lt;/b&amp;gt;&lt;br /&gt;
* comma separated predicates in simple CASE statement,&lt;br /&gt;
* SIGNAL statement,&lt;br /&gt;
* PREPARE can contain any expression,&lt;br /&gt;
* unsupported CALL statement&lt;br /&gt;
* support standard multiassign statement (list version in mysql is nonstandard),&lt;br /&gt;
&lt;br /&gt;
=== Difference from PL/pgSQL ===&lt;br /&gt;
* syntax,&lt;br /&gt;
* all function&amp;#039;s arguments are writeble.&lt;br /&gt;
* exception level depends on SQLSTATE &lt;br /&gt;
** 00000 INFO&lt;br /&gt;
** 01000 WARNING&lt;br /&gt;
** 02000 WARNING (NO DATA or NOT FOUND)&lt;br /&gt;
** xxxxx EXCEPTION&lt;br /&gt;
* cursor statements are ansi compatible &lt;br /&gt;
** FETCH can specify direction&lt;br /&gt;
** OPEN cannot use parameters (but can specify unbound cursor)&lt;br /&gt;
* composed types variables are default NULL and can be NULL&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BEGIN&lt;br /&gt;
DECLARE a mytype;&lt;br /&gt;
  SET a = mytype(); -- default constructor&lt;br /&gt;
  a.prop1(10); -- default its eq SET a.prop = 10&lt;br /&gt;
END;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Supported statements ==&lt;br /&gt;
plpgpsm samples:&lt;br /&gt;
* [[basic statements SQL/PSM samples]],&lt;br /&gt;
* [[dynamic SQL in SQL/PSM samples]],&lt;br /&gt;
* [[dynamic cursors support samples]],&lt;br /&gt;
* [[SQL statements in SQL/PSM samples]],&lt;br /&gt;
* [[Exception handling and signaling in SQL/PSM samples]],&lt;br /&gt;
* [[cursors in SQL/PSM samples]],&lt;br /&gt;
* [[table expression in RETURN statement for SRF functions]].&lt;br /&gt;
* [[enhanced diagnostics statement]]&lt;br /&gt;
&lt;br /&gt;
== Needs ==&lt;br /&gt;
* &amp;lt;strike&amp;gt;cleaning of code, most of changes are in gram.y, other code is still plpgsql, remove a lot of dead code&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* documentation, translating [[Příručka SQL/PSM]] from czech to english,&lt;br /&gt;
* &amp;lt;strike&amp;gt;regress tests&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* testing,&lt;br /&gt;
* &amp;lt;strike&amp;gt;patch core (scrollable cursors, trappable warnings)&amp;lt;/strike&amp;gt;Can wait,&lt;br /&gt;
* any information about SQL/PSM (people, history, implementations, ...)&lt;br /&gt;
* &amp;lt;strike&amp;gt;has anybody &amp;quot;Understanding SQL&amp;#039;s Stored Procedures: A Complete Guide to SQL/PSM&amp;quot;?&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;yep, there is a book http://www.amazon.com/Understanding-Sqls-Stored-Procedures-Management/dp/1558604618 (Only for USA :-( )&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ToDo ==&lt;br /&gt;
* &amp;lt;strike&amp;gt;exception trapping (continue and exit handlers for exceptions)&amp;lt;/strike&amp;gt;.&lt;br /&gt;
* &amp;lt;strike&amp;gt;cursors and FOR stmt, different directions for fetch statement&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;parametrized prepared statement and EXECUTE USING&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* all PostgreSQL variables can be accessed via GET DIAGNOSTIC &amp;lt;strike&amp;gt;and modified via SET&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;resignal (warning can be handled outer???)&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;states in handler&amp;#039;s declarations are disjoint&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;order of handlers, the most specific handlers has bigger priority&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;close unclosed cursors declared in block when leave block&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;all users signals has only one sqlstate (if sqlstate isn&amp;#039;t defined by SQLSTATE) and is divided by conditional_name&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* any expression can signal NOT FOUND (set a = &amp;#039;aaaa&amp;#039; || (SELECT a FROM b WHERE a = 10))&lt;br /&gt;
* &amp;lt;strike&amp;gt;GET STACKED DIAGNOSTIC&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* &amp;lt;strike&amp;gt;merge patch scrollable cursor for 8.3&amp;lt;/strike&amp;gt;,&lt;br /&gt;
* holdable cursor support (have to be supported SPI),&lt;br /&gt;
* composed types variables are default NULL and can be NULL&lt;br /&gt;
&lt;br /&gt;
== Questions ==&lt;br /&gt;
* &amp;lt;strike&amp;gt;SECURE DEFINER or SECURE CALLER will be default?&amp;lt;/strike&amp;gt; SECURE CALLER - reason is compatibility with others PL envoronments,&lt;br /&gt;
* reformat dump: dump dummy functions, dump tables, dump full functions (for statement)&lt;br /&gt;
* &amp;lt;strike&amp;gt;ANSI SQL SRF functions RETURNS TABLE(c1,c2,c3) ~ (OUT c1, OUT c2, OUT c3) RETURNS SETOF RECORD&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Errors ==&lt;br /&gt;
* &amp;lt;strike&amp;gt;cannot redefine variable in nested block&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
PL/pgPSM is supported for PostgreSQL versions 8.1, 8.2, 8.3. &lt;br /&gt;
&lt;br /&gt;
=== newer 0.2.0 ===&lt;br /&gt;
* src from http://pgfoundry.org/frs/download.php/1325/plpgpsm-0.2.3.tgz&lt;br /&gt;
* extract into src/contrib/plpgpsm&lt;br /&gt;
* make install&lt;br /&gt;
* psql anydb&lt;br /&gt;
* \i plpgpsm.sql&lt;br /&gt;
* make installcheck&lt;br /&gt;
&lt;br /&gt;
or teoreticly (not testested) can be compiled without postgresql source tree (you need develop libraries)&lt;br /&gt;
* extract somewhere&lt;br /&gt;
* cd plpgpsm&lt;br /&gt;
* make -f Makefile.pgxs&lt;br /&gt;
* make -f Makefile.pgxs install&lt;br /&gt;
* psql anydb&lt;br /&gt;
* \i plpgpsm.sql&lt;br /&gt;
&lt;br /&gt;
=== older 0.2.0 ===&lt;br /&gt;
* download src from http://pgfoundry.org/frs/download.php/1236/plpgpsm-01.tar.gz&lt;br /&gt;
* extract into src/pl/plpgpsm (in PostgreSQL 8.2 source tree) .. similar plpgsql&lt;br /&gt;
* modify src/pl/Makefile .. on line 29 add DIRS += plpgpsm&lt;br /&gt;
* go to src/pl/plpgpsm/src amd make install&lt;br /&gt;
* restart postgresql server&lt;br /&gt;
* in psql do (as superuser) &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  INSERT INTO pg_pltemplate &lt;br /&gt;
    VALUES(&amp;#039;plpgpsm&amp;#039;,true,&amp;#039;plpgpsm_call_handler&amp;#039;,&amp;#039;plpgpsm_validator&amp;#039;,&amp;#039;$libdir/plpgpsm&amp;#039;, NULL)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* make check&lt;br /&gt;
* create lang plpgpsm your_db&lt;br /&gt;
* use it &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Questions, ideas: Pavel Stehule (okbob on freenode, ICQ: 138051654, stehule@kix.fsv.cvut.cz)&lt;br /&gt;
&lt;br /&gt;
== Conformance with ANSI ==&lt;br /&gt;
* Feature P002, “Computational completeness”&lt;br /&gt;
* Feature P005 &amp;quot;Qualified SQL variable references&amp;quot;&lt;br /&gt;
* Feature P006, “Multiple assignment”&lt;br /&gt;
* Feature P007, “Enhanced diagnostics management&amp;quot;&lt;br /&gt;
* Feature P008, “Comma-separated predicates in simple CASE statement”&lt;/div&gt;</summary>
		<author><name>imported&gt;WikiSysop</name></author>
	</entry>
</feed>