2 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
3 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
4 <!ENTITY % myents SYSTEM "entities.inc">
8 <!-- Object Oriented Data Definition Language -->
9 <reference id="ref-ooddl">
10 <title>Object Oriented Data Definition Language (OODDL)</title>
13 The Object Oriented Data Definition Language (OODDL) provides
14 access to relational SQL tables using Common Lisp Object System
15 (CLOS) objects. SQL tables are mapped to CLOS objects with the
16 SQL columns being mapped to slots of the CLOS object.
19 The mapping between SQL tables and CLOS objects is defined with
21 linkend="def-view-class"><function>def-view-class</function></link>. SQL
22 tables are created with <link
23 linkend="create-view-from-class"><function>create-view-from-class</function></link>
24 and SQL tables can be deleted with <link
25 linkend="drop-view-from-class"><function>drop-view-from-class</function></link>.
28 <para>The above functions refer to the Lisp
29 <emphasis>view</emphasis> of the SQL table. This Lisp view
30 should not be confused with SQL <function>VIEW</function>
35 <refentry id="standard-db-object">
37 <refname>STANDARD-DB-OBJECT</refname>
38 <refpurpose>Superclass for all &clsql; View Classes.</refpurpose>
39 <refclass>Class</refclass>
42 <title>Class Precedence List</title>
44 <simplelist type="inline">
45 <member><type>standard-db-object</type></member>
46 <member><type>standard-object</type></member>
47 <member><type>t</type></member>
52 <title>Description</title> <para>This class is the superclass
53 of all &clsql; View Classes.</para>
56 <title>Class details</title>
57 <programlisting>(defclass STANDARD-DB-OBJECT ()(...))</programlisting>
63 <member>slot VIEW-DATABASE is of type (OR NULL DATABASE)
64 which stores the associated database for the
71 <refentry id="default-string-length">
73 <refname>*DEFAULT-STRING-LENGTH*</refname>
74 <refpurpose>Default length of SQL strings.</refpurpose>
75 <refclass>Variable</refclass>
78 <title>Value Type</title>
84 <title>Initial Value</title>
85 <para><parameter>255</parameter></para>
88 <title>Description</title>
90 If a slot of a class defined by
91 <function>def-view-class</function> is of the type
92 <parameter>string</parameter> or
93 <parameter>varchar</parameter> and does not have a length
94 specified, then the value of this variable is used as SQL
99 <title>Examples</title>
101 (let ((*default-string-length* 80))
102 (def-view-class s80 ()
104 (b :type (string 80))
106 => #<Standard-Db-Class S80 {480A431D}>
108 (create-view-from-class 's80)
110 (table-exists-p [s80])
114 The above code causes a SQL table to be created with the SQL command
116 <screen>CREATE TABLE (A VARCHAR(80), B CHAR(80), C VARCHAR(80))</screen>
119 <title>Affected By</title>
121 Some SQL backends do not support
122 <parameter>varchar</parameter> lengths greater than 255.
126 <title>See Also</title>
131 <para>This is a CLSQL extension to the CommonSQL API.</para>
135 <refentry id="create-view-from-class">
137 <refname>CREATE-VIEW-FROM-CLASS</refname>
138 <refpurpose>Create a SQL table from a <glossterm linkend="gloss-view-class">View Class</glossterm>.</refpurpose>
139 <refclass>Function</refclass>
142 <title>Syntax</title>
144 <function>create-view-from-class</function> <replaceable>view-class-name</replaceable> &key <replaceable>database</replaceable> <replaceable>transactions</replaceable> => <returnvalue><!-- no values --></returnvalue></synopsis>
147 <title>Arguments and Values</title>
150 <term><parameter>view-class-name</parameter></term>
153 The name of a <glossterm linkend="gloss-view-class">View
154 Class</glossterm> that has been defined with <link
155 linkend="def-view-class"><function>def-view-class</function></link>.
160 <term><parameter>database</parameter></term>
164 linkend="gloss-database-object">database</glossterm> in
165 which to create the SQL table. This will default to the
166 value of <symbol>*default-database*</symbol>.
171 <term><parameter>transactions</parameter></term>
174 When &nil; specifies that a table type which does not
175 support transactions should be used.
182 <title>Description</title>
184 Creates a table as defined by the <glossterm
185 linkend="gloss-view-class">View Class</glossterm>
186 <parameter>view-class-name</parameter> in
187 <parameter>database</parameter>.
191 <title>Examples</title>
193 (def-view-class foo () ((a :type (string 80))))
194 => #<Standard-Db-Class FOO {4807F7CD}>
195 (create-view-from-class 'foo)
202 <title>Side Effects</title>
204 Causes a table to be created in the SQL database.
208 <title>Affected by</title>
210 Most SQL database systems will signal an error if a table
211 creation is attempted when a table with the same name already
212 exists. The SQL user, as specified in the database connection,
213 must have sufficient permission for table creation.
217 <title>Exceptional Situations</title>
219 A condition will be signaled if the table can not be created
224 <title>See Also</title>
227 <member><link linkend="def-view-class"><function>def-view-class</function></link></member>
228 <member><link linkend="drop-view-from-class"><function>drop-view-from-class</function></link></member>
235 Currently, only &mysql; supports transactionless
236 tables. &clsql; provides the ability to create such tables for
237 applications which would benefit from faster table access and
238 do not require transaction support.
241 The case of the table name is determined by the type of the
242 database. &mysql;, for example, creates databases in upper-case
243 while &postgresql; uses lowercase.
248 <refentry id="def-view-class">
250 <refname>DEF-VIEW-CLASS</refname>
251 <refpurpose>Defines CLOS classes with mapping to SQL database.</refpurpose>
252 <refclass>Macro</refclass>
255 <title>Syntax</title>
257 <function>def-view-class</function> <replaceable>name</replaceable> <replaceable>superclasses</replaceable> <replaceable>slots</replaceable> &rest <replaceable>class-options</replaceable> => <returnvalue>class</returnvalue></synopsis>
260 <title>Arguments and Values</title>
263 <term><parameter>name</parameter></term>
271 <term><parameter>superclasses</parameter></term>
274 The superclasses for the defined class.
279 <term><parameter>slots</parameter></term>
282 The class slot definitions.
287 <term><parameter>class options</parameter></term>
295 <term><parameter>class</parameter></term>
305 <title>Slot Options</title>
309 <parameter>:db-kind</parameter> - specifies the kind of
310 database mapping which is performed for this slot and
311 defaults to <parameter>:base</parameter> which indicates
312 that the slot maps to an ordinary column of the database
313 table. A <parameter>:db-kind</parameter> value of
314 <parameter>:key</parameter> indicates that this slot is a
315 special kind of <parameter>:base</parameter> slot which
316 maps onto a column which is one of the unique keys for the
317 database table, the value <parameter>:join</parameter>
318 indicates this slot represents a join onto another
319 <glossterm linkend="gloss-view-class">View Class</glossterm>
320 which contains View Class objects, and the value
321 <parameter>:virtual</parameter> indicates a standard CLOS
322 slot which does not map onto columns of the database
328 <parameter>:db-info</parameter> - if a slot is specified
329 with <parameter>:db-kind</parameter>
330 <parameter>:join</parameter>, the slot option
331 <parameter>:db-info</parameter> contains a property list
332 which specifies the nature of the join. The valid members
338 <parameter>:join-class</parameter>
339 <emphasis>class-name</emphasis> - the name of the
345 <parameter>:home-key</parameter>
346 <emphasis>slot-name</emphasis> - the name of the slot
347 of this class for joining
352 <parameter>:foreign-key</parameter>
353 <emphasis>slot-name</emphasis> - the name of the slot
354 of the <parameter>:join-class</parameter> for joining
359 <parameter>:target-slot</parameter>
360 <emphasis>target-slot</emphasis> - this is an optional
361 parameter. If specified, then the join slot of the
362 defining class will contain instances of this target
363 slot rather than of the join class. This can be useful
364 when the <parameter>:join-class</parameter> is an
365 intermediate class in a
366 <emphasis>many-to-many</emphasis> relationship and the
367 application is actually interested in the
368 <parameter>:target-slot</parameter>.
373 <parameter>:retrieval</parameter>
374 <emphasis>time</emphasis> - The default value is
375 <parameter>:deferred</parameter>, which defers filling
376 this slot until the value is accessed. The other valid
377 value is <parameter>:immediate</parameter> which
378 performs the SQL query when the instance of the class
379 is created. In this case, the
380 <parameter>:set</parameter> is automatically set to
386 <parameter>:set</parameter> <emphasis>set</emphasis> -
387 This controls what is stored in the join slot. The
388 default value is &t;. When <emphasis>set</emphasis> is
389 &t; and <emphasis>target-slot</emphasis> is undefined,
390 the join slot will contain a list of instances of the
391 join class. Whereas, if
392 <emphasis>target-slot</emphasis> is defined, then the
393 join slot will contain a list of pairs of
394 <emphasis>(target-value join-instance)</emphasis>.
395 When <emphasis>set</emphasis> is &nil;, the join slot
396 will contain a single instances.
403 <parameter>:type</parameter> - for slots of
404 <parameter>:db-kind</parameter> <parameter>:base</parameter> or
405 <parameter>:key</parameter>, the <parameter>:type</parameter> slot
406 option has a special interpretation such that Lisp
407 types, such as string, integer and float are
408 automatically converted into appropriate SQL types for
409 the column onto which the slot maps. This behaviour may
410 be overridden using the <parameter>:db-type</parameter> slot
411 option. The valid values are:
414 <parameter>string</parameter> - a variable length
415 character field up to <link
416 linkend="default-string-length">*default-string-length*</link>
420 <parameter>(string n)</parameter> - a fixed length
421 character field <parameter>n</parameter> characters
425 <parameter>varchar</parameter> - a variable length
426 character field up to <link
427 linkend="default-string-length">*default-string-length*</link>
431 <parameter>(varchar n)</parameter> - a variable length
432 character field up to <parameter>n</parameter>
433 characters in length.
436 <parameter>char</parameter> - a single character field
438 <member><parameter>integer</parameter> - signed integer
439 at least 32-bits wide</member>
440 <member><parameter>(integer n)</parameter></member>
441 <member><parameter>float</parameter></member>
442 <member><parameter>(float n)</parameter></member>
443 <member><parameter>long-float</parameter></member>
444 <member><parameter>number</parameter></member>
445 <member><parameter>(number n)</parameter></member>
446 <member><parameter>(number n p)</parameter></member>
448 <parameter>tinyint</parameter> - An integer column 8-bits
449 wide. [not supported by all database backends]
452 <parameter>smallint</parameter> - An integer column 16-bits
453 wide. [not supported by all database backends]
456 <parameter>bigint</parameter> - An integer column
457 64-bits wide. [not supported by all database backends]
460 <parameter>universal-time</parameter> - an integer
461 field sufficiently wide to store a
462 universal-time. On most databases, a slot of this
463 type assigned a SQL type of
464 <parameter>BIGINT</parameter>
467 <parameter>wall-time</parameter> - a slot which stores
468 a date and time in a SQL timestamp column. &clsql;
469 provides a number of time manipulation functions to
470 support objects of type <type>wall-time</type>.
473 <parameter>date</parameter> - a slot which stores the
474 date (without any time of day resolution) in a
475 column. &clsql; provides a number of time
476 manipulation functions that operate on date values.
479 <parameter>duration</parameter> - stores a
480 <type>duration</type> structure. &clsql; provides
481 routines for <type>wall-time</type> and
482 <type>duration</type> processing.
484 <member><parameter>boolean</parameter> - stores a &t; or
485 &nil; value.</member>
487 <parameter>generalized-boolean</parameter> - similar
488 to a <parameter>boolean</parameter> in that either a
489 &t; or &nil; value is stored in the SQL
490 database. However, any Lisp object can be stored in
491 the Lisp object. A Lisp value of &nil; is stored as
492 <constant>FALSE</constant> in the database, any
493 other Lisp value is stored as
494 <constant>TRUE</constant>.
497 <parameter>keyword</parameter> - stores a keyword
499 <member><parameter>symbol</parameter> - stores a symbol</member>
501 <parameter>list</parameter> - stores a list by writing
502 it to a string. The items in the list must be able to
505 <member><parameter>vector</parameter> - stores a vector
506 similarly to <parameter>list</parameter></member>
507 <member><parameter>array</parameter> - stores a array
508 similarly to <parameter>list</parameter></member>
515 <parameter>:column</parameter> - specifies the name of
516 the SQL column which the slot maps onto, if
517 <parameter>:db-kind</parameter> is not
518 <parameter>:virtual</parameter>, and defaults to the
519 slot name. If the slot name is used for the SQL column
520 name, any hypens in the slot name are converted
521 to underscore characters.
526 <parameter>:void-value</parameter> - specifies the value
527 to store in the Lisp instance if the SQL value is NULL and
533 <parameter>:db-constraints</parameter> - is a keyword
534 symbol representing an SQL column constraint expression or
535 a list of such symbols. The following column constraints
536 are supported: <symbol>:not-null</symbol>,
537 <symbol>:primary-key</symbol>, <symbol>:unique</symbol>,
538 <symbol>:unsigned</symbol> (&mysql; specific),
539 <symbol>:zerofill</symbol> (&mysql; specific) and
540 <symbol>:auto-increment</symbol> (&mysql; specific).
545 <parameter>:db-type</parameter> - a string to specify the SQL
546 column type. If specified, this string overrides the SQL
547 column type as computed from the <parameter>:type</parameter>
553 <parameter>:db-reader</parameter> - If a string, then when
554 reading values from the database, the string will be used
555 for a format string, with the only value being the value
556 from the database. The resulting string will be used as
557 the slot value. If a function then it will take one
558 argument, the value from the database, and return the
559 value that should be put into the slot. If a symbol, then
560 the symbol-function of the symbol will be used.
565 <parameter>:db-writer</parameter> - If a string, then when
566 reading values from the slot for the database, the string
567 will be used for a format string, with the only value
568 being the value of the slot. The resulting string will be
569 used as the column value in the database. If a function
570 then it will take one argument, the value of the slot, and
571 return the value that should be put into the database. If
572 a symbol, then the symbol-function of the symbol will be
579 <title>Class Options</title>
584 <parameter>:base-table</parameter> - specifies the name
585 of the SQL database table. The default value is the
586 class name. Like slot names, hypens in the class name
587 are converted to underscore characters.
592 <parameter>:normalizedp</parameter> - specifies whether
593 this class uses normalized inheritance from parent classes.
594 Defaults to nil, i.e. non-normalized schemas. When true,
595 SQL database tables that map to this class and parent
596 classes are joined on their primary keys to get the full
597 set of database columns for this class.
604 <title>Description</title>
606 Creates a <glossterm linkend="gloss-view-class">View
607 Class</glossterm> called <parameter>name</parameter> whose
608 slots <parameter>slots</parameter> can map onto the attributes
609 of a table in a database. If
610 <parameter>superclasses</parameter> is &nil; then the
611 superclass of <parameter>class</parameter> will be
612 <parameter>standard-db-object</parameter>, otherwise
613 <parameter>superclasses</parameter> is a list of superclasses
614 for <parameter>class</parameter> which must include
615 <parameter>standard-db-object</parameter> or a descendent of
619 <title>Normalized inheritance schemas</title>
621 Specifying that <symbol>:normalizedp</symbol> is <symbol>T</symbol>
622 tells &clsql; to normalize the database schema for inheritance.
623 What this means is shown in the examples below.
627 With <symbol>:normalizedp</symbol> equal to <symbol>NIL</symbol>
628 (the default) the class inheritance would result in the following:
631 (def-view-class node ()
632 ((title :accessor title :initarg :title :type (varchar 240))))
635 +-------+--------------+------+-----+---------+-------+
636 | Field | Type | Null | Key | Default | Extra |
637 +-------+--------------+------+-----+---------+-------+
638 | TITLE | varchar(240) | YES | | NULL | |
639 +-------+--------------+------+-----+---------+-------+
641 (def-view-class user (node)
642 ((user-id :accessor user-id :initarg :user-id
643 :type integer :db-kind :key :db-constraints (:not-null))
644 (nick :accessor nick :initarg :nick :type (varchar 64))))
647 +---------+--------------+------+-----+---------+-------+
648 | Field | Type | Null | Key | Default | Extra |
649 +---------+--------------+------+-----+---------+-------+
650 | USER_ID | int(11) | NO | PRI | | |
651 | NICK | varchar(64) | YES | | NULL | |
652 | TITLE | varchar(240) | YES | | NULL | |
653 +---------+--------------+------+-----+---------+-------+
657 Using <symbol>:normalizedp</symbol> <symbol>T</symbol>, both
658 view-classes need a primary key to join them on:
661 (def-view-class node ()
662 ((node-id :accessor node-id :initarg :node-id
663 :type integer :db-kind :key
664 :db-constraints (:not-null))
665 (title :accessor title :initarg :title :type (varchar 240))))
668 +---------+--------------+------+-----+---------+-------+
669 | Field | Type | Null | Key | Default | Extra |
670 +---------+--------------+------+-----+---------+-------+
671 | NODE_ID | int(11) | NO | PRI | | |
672 | TITLE | varchar(240) | YES | | NULL | |
673 +---------+--------------+------+-----+---------+-------+
675 (def-view-class user (node)
676 ((user-id :accessor user-id :initarg :user-id
677 :type integer :db-kind :key :db-constraints (:not-null))
678 (nick :accessor nick :initarg :nick :type (varchar 64)))
682 +---------+-------------+------+-----+---------+-------+
683 | Field | Type | Null | Key | Default | Extra |
684 +---------+-------------+------+-----+---------+-------+
685 | USER_ID | int(11) | NO | PRI | | |
686 | NICK | varchar(64) | YES | | NULL | |
687 +---------+-------------+------+-----+---------+-------+
691 In this second case, all slots of the view-class 'node
692 are also available in view-class 'user, and can be used
693 as one would expect. For example, with the above normalized
694 view-classes 'node and 'user, and SQL tracing turned on:
697 CLSQL> (setq test-user (make-instance 'user :node-id 1 :nick "test-user"
698 :title "This is a test user"))
699 <![CDATA[#<USER {1003B392E1}>]]>
701 CLSQL> (update-records-from-instance test-user :database db)
703 ;; .. => INSERT INTO NODE (NODE_ID,TITLE) VALUES (1,'This is a test user')
705 ;; .. => INSERT INTO USER (USER_ID,NICK) VALUES (1,'test-user')
710 CLSQL> (node-id test-user)
713 CLSQL> (title test-user)
714 "This is a test user"
716 CLSQL> (nick test-user)
722 <title>Examples</title>
724 The following examples are from the &clsql; test suite.
727 (def-view-class person (thing)
728 ((height :db-kind :base :accessor height :type float
730 (married :db-kind :base :accessor married :type boolean
732 (birthday :type clsql:wall-time :initarg :birthday)
733 (bd-utime :type clsql:universal-time :initarg :bd-utime)
734 (hobby :db-kind :virtual :initarg :hobby :initform nil)))
736 (def-view-class employee (person)
739 :db-constraints :not-null
744 :db-constraints :not-null
750 :initarg :first-name)
756 :accessor employee-email
763 :accessor employee-company
765 :db-info (:join-class company
767 :foreign-key companyid
773 :accessor employee-manager
775 :db-info (:join-class employee
780 :accessor employee-addresses
782 :db-info (:join-class employee-address
787 (:base-table employee))
789 (def-view-class company ()
792 :db-constraints :not-null
797 :db-constraints :not-null
805 :initarg :presidentid)
809 :db-info (:join-class employee
810 :home-key presidentid
814 :reader company-employees
816 :db-info (:join-class employee
817 :home-key (companyid groupid)
818 :foreign-key (ecompanyid groupid)
821 (def-view-class address ()
824 :db-constraints :not-null
829 :initarg :street-number)
833 :initarg :street-name)
836 :void-value "no city"
843 :initarg :postal-code))
846 ;; many employees can reside at many addressess
847 (def-view-class employee-address ()
848 ((aemplid :type integer :initarg :emplid)
849 (aaddressid :type integer :initarg :addressid)
850 (verified :type boolean :initarg :verified)
851 (address :db-kind :join
852 :db-info (:join-class address
854 :foreign-key addressid
855 :retrieval :immediate)))
856 (:base-table "ea_join"))
858 (def-view-class deferred-employee-address ()
859 ((aemplid :type integer :initarg :emplid)
860 (aaddressid :type integer :initarg :addressid)
861 (verified :type boolean :initarg :verified)
862 (address :db-kind :join
863 :db-info (:join-class address
865 :foreign-key addressid
868 (:base-table "ea_join"))
872 <title>Side Effects</title>
873 <para>Creates a new CLOS class.</para>
876 <title>Affected by</title>
882 <title>Exceptional Situations</title>
888 <title>See Also</title>
891 <member><link linkend="create-view-from-class"><function>create-view-from-class</function></link></member>
892 <member><link linkend="standard-db-object"><parameter>standard-db-object</parameter></link></member>
893 <member><link linkend="drop-view-from-class"><function>drop-view-from-class</function></link></member>
900 The actual SQL type for a column depends up the database type
901 in which the SQL table is stored. As an example, the view
902 class type <parameter>(varchar 100)</parameter> specifies a
903 SQL column type <parameter>VARCHAR(100)</parameter> in &mysql;
904 and a column type <parameter>VARCHAR2(100)</parameter> in
908 The actual lisp type for a slot may be different than the
909 value specified by the <parameter>:type</parameter> attribute.
910 For example, a slot declared with "<parameter>:type (string
911 30)</parameter>" actually sets the slots Lisp type as
912 <parameter>(or null string)</parameter>. This is to allow a
913 &nil; value or a string shorter than 30 characters to be
919 <refentry id="drop-view-from-class">
921 <refname>DROP-VIEW-FROM-CLASS</refname>
922 <refpurpose>Delete table from SQL database.</refpurpose>
923 <refclass>Function</refclass>
926 <title>Syntax</title>
928 <function>drop-view-from-class</function> <replaceable>view-class-name</replaceable> &key <replaceable>database</replaceable> => <returnvalue><!-- result --></returnvalue></synopsis>
931 <title>Arguments and Values</title>
934 <term><parameter>view-class-name</parameter></term>
937 The name of the <glossterm linkend="gloss-view-class">View
943 <term><parameter>database</parameter></term>
946 <glossterm linkend="gloss-database-object">database
947 object</glossterm>. This will default to the value of
948 <symbol>*default-database*</symbol>.
955 <title>Description</title>
956 <para>Removes a table defined by the <glossterm
957 linkend="gloss-view-class">View Class</glossterm>
958 <parameter>view-class-name</parameter> from
959 <parameter>database</parameter> which defaults to
960 <parameter>*default-database*</parameter>.
964 <title>Examples</title>
968 (drop-view-from-class 'foo)
975 <title>Side Effects</title>
977 Deletes a table from the SQL database.
981 <title>Affected by</title>
983 Whether the specified table exists in the SQL database.
987 <title>Exceptional Situations</title>
989 A condition may be signalled if the table does not exist in
990 the SQL database or if the SQL connection does not have
991 sufficient permissions to delete tables.
995 <title>See Also</title>
998 <member><link linkend="create-view-from-class"><function>create-view-from-class</function></link></member>
999 <member><link linkend="def-view-class"><function>def-view-class</function></link></member>
1004 <title>Notes</title>
1011 <refentry id="list-classes">
1013 <refname>LIST-CLASSES</refname>
1014 <refpurpose>List classes for tables in SQL database.</refpurpose>
1015 <refclass>Function</refclass>
1018 <title>Syntax</title>
1020 <function>list-classes</function> &key <replaceable>test</replaceable> <replaceable>root-class</replaceable> <replaceable>database</replaceable> => <returnvalue>classes</returnvalue></synopsis>
1023 <title>Arguments and Values</title>
1026 <term><parameter>test</parameter></term>
1029 a function used to filter the search. By default, <parameter>identity</parameter> is used which
1030 will return all classes.
1035 <term><parameter>root-class</parameter></term>
1038 specifies the root class to the search. By default,
1039 <parameter>standard-db-object</parameter> is used which
1040 is the root for all view classes.
1045 <term><parameter>database</parameter></term>
1049 linkend="gloss-database-object">database</glossterm> to
1050 search for view classes. This will default to the value
1051 of <symbol>*default-database*</symbol>.
1056 <term><parameter>classes</parameter></term>
1059 List of view classes.
1066 <title>Description</title>
1067 <para>Returns a list of all the View Classes which have been
1068 defined in the Lisp session and are connected to
1069 <parameter>database</parameter> and which descended from the
1070 class <parameter>root-class</parameter> and which satisfy the
1071 function <parameter>test</parameter>.
1075 <title>Examples</title>
1078 => (#<clsql-sys::standard-db-class big> #<clsql-sys::standard-db-class employee-address>
1079 #<clsql-sys::standard-db-class address> #<clsql-sys::standard-db-class company>
1080 #<clsql-sys::standard-db-class employee>)
1082 (list-classes :test #'(lambda (c) (> (length (symbol-name (class-name c))) 3)))
1083 => (#<clsql-sys::standard-db-class employee-address> #<clsql-sys::standard-db-class address>
1084 #<clsql-sys::standard-db-class company> #<clsql-sys::standard-db-class employee>)
1088 <title>Side Effects</title>
1094 <title>Affected by</title>
1097 <member>Which view classes have been defined in the Lisp
1103 <title>Exceptional Situations</title>
1109 <title>See Also</title>
1112 <member><link linkend="def-view-class"><function>def-view-class</function></link></member>
1117 <title>Notes</title>