Useful DQL Queries

1. DQL to create user
create “dm_user” object
set client_capability=2,
set default_folder=’’,
set home_docbase=’’,
set mailto:user_address=’a@abc.com’,
set user_os_domain=’’,
set user_name=’’,
set user_os_name=’’,
set user_privileges=0;
2. DQL to execute stored procedure (works for all supported DBMSes)
execute exec_sql with query=’execute my_sp_test ”123”,”prasad” ‘;
3. Running DQL in batch mode
a. Create a dql file
b. Run the following from command prompt
$idql docbasename -Uusername -Ppassword -Rtest.dql
Example command
C:\Documentum\product\5.3\bin>idql32 docbasename-Uusername -Ppassword -RC:
\test.dql
test.dql would contain something like this
go
go
4. DQL to Get all Files under a Particular Cabinet
select r_object_id, object_name from dm_document(all) where folder(’/Cabinet name’, descend);
The above DQL gives all versions. To get only current versions
select * from dm_document where folder (’/Cabinet name’, descend)
5. DQL to get total number of documents and folders under a cabinet
SELECT count(*) as cnt, ‘Docs’ as category FROM dm_document(all)
WHERE FOLDER (’/Cabinet Name’,DESCEND)
UNION
SELECT count(*) as cnt, ‘Folders’ as category FROM dm_folder
WHERE FOLDER (’/Cabinet Name’,DESCEND)
6. DQL to find whether a document is a part of virtual document
SELECT object_name,r_object_id FROM dm_sysobject
WHERE r_object_id IN
(SELECT parent_id FROM dmr_containment
WHERE component_id = (SELECT i_chronicle_id FROM dm_sysobject WHERE r_object_id = ‘’))
7. Repeating attributes
Repeated attribute queries are always a fun. I am going to present here more repeated attribute queries. But for starters, recognize the importance of ANY keyword
select r_folder_path from dm_folder where object_name
=’myFolder’ and any r_folder_path =’/Cabinet Name/test’;
8. DQL to find object type of a document
select r_object_type from dm_document where object_name=’ObjectName’;
9. DQL for index
Following query creates index
EXECUTE make_index WITH type_name=’dmi_workitem’,attribute=’r_workflow_id’
Using the query below, one can find out whether index has been succesfully created or alternatively whether the index exists or not
Select r_object_id,index_type,attribute,attr_count,data_space from dmi_index where index_type in (select r_object_id from dm_type where name=’dmi_workitem’);
10. DQL to see sessions
execute show_sessions
11. Enable FTDQL
SELECT
r_object_id,
score,
text,
object_name,
r_object_type,
r_lock_owner,
owner_name,
r_link_cnt,
r_is_virtual_doc,
r_content_size,
a_content_type,
i_is_reference,
r_assembled_from_id,
r_has_frzn_assembly,
a_compound_architecture,
i_is_replica,
r_policy_id,acl_name,
r_creation_date,
r_modify_date,
subject
FROM
custom_document
WHERE
(custom_attr1 = ’search1′ AND
(custom_attr2 = ’search2′ AND
)) AND
(a_is_hidden = FALSE)
ENABLE
(FTDQL)
12. DQL to get current date, time
select DATE(now) as systime from dm_server_config;
13. DQL to list all available templates in Webpublisher
select * from my_document where folder(’/WebPublisher Configuration/Content Templates/myTemplates’,descend) and any r_version_label =’Approved’;
14. DQL to list objects having duplicate names
SELECT object_name, count(*) FROM dm_document
GROUP BY object_name
HAVING count(*) > 1
ORDER BY object_name
15. Clear INBOX
delete dmi_queue_item objects where delete_flag=0
16. DQL to retrieve all required attributes of a particular type
SELECT attr_name FROM dmi_dd_attr_info WHERE type_name=’dm_document’ AND is_required 0
17. DQL to list workflow attachments
select r_component_id, r_component_name from dmi_wf_attachment where r_workflow_id = ‘’
18. If your statistics are not up to date, database may choose a very inefficient execution plan. Be sure toupdate statistics often. It is recommended that you use the dm_UpdateStatistics job as it will calculateextended statistics on particular tables and columns which provide additional performance benefits. If the DBA uses their own scripts to calculate the statistics, then these enhancements will not be available.
19.Use the script “dctm_indexes_by_table.sql” to generate a list of all indexes on Documentum tables, ordered by table name. (Available from http://developer.documentum.com.)
Use the script “dctm_indexes_by_index.sql” to generate a list of all indexes on Documentum tables,
ordered by index name. (Available from http://developer.documentum.com.)
20.It is strongly recommended that all indexes on Documentum base tables be created from within Documentum and not at the database level.
There are two reasons for this:
The internal conversion process from DQL to SQL will check for the presence of a dmi_index object for repeating valued attributes and will generate different SQL according to what it finds.
If indexes are created directly through SQL*Plus, then Documentum will not know anything about them and will assume it is unindexed. This may result in a less efficient SQL query.
Secondly, if the indexes are created from within Documentum, and they are inadvertently dropped, the dm_DBWarning job will automatically recreate them at next execution.
The syntax for creating new indexes is as follows:
In DQL:
EXECUTE make_index WITH type_name=object_type,
attribute=attribute_name{,attribute=attribute_name,…)
or
Using APIs:
dmAPIGet(”apply,session,NULL,MAKE_INDEX,TYPE_NAME,S,object_type,ATTRIBUTE,S
,attribute_name(,ATTRIBUTE,S,attribute_name,…}
These indexes will be created in the tablespace identified by the index_store server.ini parameter.
Be sure to create the index on the appropriate type table.
For example, although ‘keywords’ is an attribute of the dm_document type, it is actually inherited from ‘keywords’ from the dm_sysobject type.
Drop the Index if Necessary
If there is no performance improvement, OR the optimizer is not using the new index, drop it using:
EXECUTE drop_index [[FOR] dmi_index_id] [WITH name = index_name]
or
dmAPIGet(”apply,session,dmi_index_id,DROP_INDEX [,NAME,S,index_name]“)
21. Using the iapi utility and the trace API you can generate log information that contains the SQL resulting from a DQL query.
This is useful when it is a DQL query that is performing poorly and you wish to test using a nonsuperuser account. Non-query type APIs are not traced.
Here is an example of tracing a simple DQL query.
trace,c,10,,DM_QUERY.
More on TKPROF here

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/sqltrace.htm

22. DQL Hints
SELECT object_name FROM dm_document ENABLE (RETURN_TOP 10)
For DB2, performance can be improved using
SELECT object_name FROM dm_document ENABLE (RETURN_TOP 10, OPTIMIZE_TOP 10)
The FETCH_ALL_RESULTS N hint fetches all the results from the database
immediately and closes the cursor. The hint does not affect the execution plan,
but may free up database resources more quickly.
To fetch all the results, set N to 0.
On SQL Server, it is recommended that you use SQL_DEF_RESULT_SETS
instead of the FETCH_ALL_RESULTS hint. SQL_DEF_RESULTS_SETS
provides the same benefits and is the recommended way to access SQL Server
databases.
Passthrough hints are hints that are passed to the RDBMS server. They are not
handled by Content Server.
To include a passthrough hint, you must identify the database for which the
hint is valid. To identify the target database, keywords precede the hints. The
valid keywords are: ORACLE, SQL_SERVER, SYBASE, and DB2. For
example, the following statement includes passthrough hints for SQL Server:
SELECT “r_object_id” FROM “dm_document”
WHERE “object_name” =’test’
ENABLE SQL_SERVER(’ROBUST PLAN’,’FAST 4’,’ROBUST PLAN’)
For portability, you can include passthrough hints for multiple databases in
one statement. The entire list of hints must be enclosed in parentheses. The
syntax is:
(database_hint_list {,database_hint_list})
where database_hint_list is:
db_keyword(’hint’{,’hint})
db_keyword is one of the valid keywords identifying a database. hint is any hint
valid on the specified database.
For example:
SELECT object_name FROM dm_document doc dm_user u
WHERE doc.r_creator_name = u.user_name ENABLE
(ORACLE(’RULE’,’PARALLEL’), SYBASE(’AT ISOLATION READ
UNCOMMITTED’),SQL_SERVER(’LOOP JOIN’,’FAST 1’)
Use FETCH_ALL_RESULTS if you want to reduce the resources used by the
database server by quickly closing cursors. On SQL Server, try
FETCH_ALL_RESULTS if using SQL_DEF_RESULT_SETS did not improve
query performance.
23. If the table is registered, check with the owner of the registered table, or a Documentum superuser, about giving you access to the table.
You will need at least a BROWSE permit on the registered table object in order to access it. If the table has not yet been registered, check with the table’s owner about registering it. Note that you must have READ access to the dm_registered object for this table in order to access it in any way (SELECT, INSERT, UPDATE, DELETE).
Note that if you specified the special dm_dbo document base owner, the first parameter will hold the actual name of the document base owner.
24. DQL to list docbrokers
execute list_targets
25. DQL to list worrkflow information
select task_name, task_state, actual_start_date, dequeued_date from dmi_queue_item where router_id = ‘workflowId’
26. Query to find active workflows, supervisors of the workflows
select r_object_id, object_name, title, owner_name,r_object_type, r_creation_date, r_modify_date, a_content_type from dm_document where r_object_id in(select r_component_id from dmi_package where r_workflow_id in (select r_object_id from dm_workflow where r_runtime_state = 1))
27. Though this is not DQL, I thought of mentioning here as it most widely used DFC operation
sysObject.queue (”dm_autorender_win31?, _
“rendition”, _
0, _
False, _
dueDate, _
“rendition_req_ps_pdf”)
28. To find ACLs related to dm_sysobject:
select r_object_id as obj_id, object_name from
dm_sysobject (all)
where acl_name =” and
acl_domain = ”
To find ACLs as the default ACL of a user:
select user_name from dm_user where acl_name=”
To find ACLs associated with a type:
select r_object_id, r_type_name from dmi_type_info where acl_domain=” and acl_name=”
When these queries do not return any related objects and you still cannot delete the ACL, use tracing:
In the Message Tester or IAPI, execute the command: apply,c,NULL,SQL_TRACE,LEVEL,I,1
Then, try to delete the ACL that is causing problem.
Turn off tracing by executing:
apply,c,NULL,SQL_TRACE,LEVEL,I,0
Examine the session log for the trace output, located in $DOCUMENTUM/dba/log//
Excerpt of the session log:
[DM_ACL_E_DESTROY_IN_USE]error: “Failed to destroy the ACL ‘Documentum Users’ in domain ‘dbabep’ because it is in use.”
[DM_SESSION_I_SESSION_QUIT]info: “Session 01000dcb80010ccf quit.”
Run the following query from Oracle SQL:
select r_object_id from dm_sysobject_s where acl_domain =’dbabep’ and acl_name =’Documentum Users’ union select r_object_id from dm_user_s where acl_domain = ‘dbabep’ and acl_name =’Documentum Users’ union select r_object_id from dmi_type_info_s where acl_domain =’dbabep’ and acl_name =’Documentum Users’
It will return the r_object_id value = 09000dcb800362c4.
Run the following query from IDQL:
select object_name
from dm_sysobject
where r_object_id=’09000dcb800362c4′
If the above query returned nothing, then this object cannot be accessed by any Documentum WorkSpace method, only via SQL in the underlying Oracle database. The following entries must be deleted at the RDBMS level: dm_sysobject_s and dm_sysobject_r tables; there are no entries in the dmi_object table
29. List of object types and corresponding identifiers. Helpful when reading the code.
00 dmi_audittrail_attrs
03 dm_type
05 dmr_containment
06 dmr_content
08 dm_application
08 dm_job
08 dm_procedure
08 dm_query
08 dm_script
08 dm_smart_list
09 dm_document
0b dm_folder
0c dm_cabinet
0d dm_assembly
10 dm_method
11 dm_user
12 dm_group
19 dm_registered
1f dmi_index
26 dmi_registry
27 dm_format
28 dm_filestore
28 dm_store
2c dm_distributedstore
2e dmi_type_info
2f dm_dump_record
30 dmi_dump_object_record
31 dm_load_record
32 dmi_load_object_record
37 dm_relation
3a dm_location
3b dm_fulltext_index
3c dm_docbase_config
3d dm_server_config
40 dm_blobstore
41 dm_note
45 dm_acl
46 dm_policy
49 dmi_package
4a dmi_workitem
4c dm_activity
4d dm_workflow
53 dm_literal_expr
5e dm_federation
5f dm_audittrail_acl
5f dm_audittrail_group
5f dm_audittrail
66 dm_alias_set
6a dmi_dd_attr_info
0b dm_taxonomy
0b dm_xml_application
6b dm_display_config
20 dmi_sequence
30. Job scheduler Query
SELECT ALL r_object_id, a_next_invocation
FROM dm_job
WHERE (
(run_now = 1)
OR ( (is_inactive = 0)
AND ( ( a_next_invocation < = DATE(’now’)
AND a_next_invocation IS NOT NULLDATE )
OR ( a_next_continuation DATE(’now’))
OR (expiration_date IS NULLDATE))
AND ( (max_iterations = 0)
OR (a_iterations Template Properties
3) Under Template Audit Trail Setting, select option ‘Always On’ – Audit trail data for each instance will be available and saved at workflow completions.
31. In a workflow, a performer can enter comments while he/she is performing the task. And those comments are carried to the next performer in this workflow. When using WebPublisher workflow report to review the workflow instances, and in workflow history, you are only able to get the truncated comments back from WP’s interface. Especially for those already aborted workflow instances, there is no way that you can get the complete comments back from WP’s GUI. In some cases, those comments are very important to our customers and they need to find a way to get those comments back.
Here is the steps to get those comments back:
==
1) Identify the workflow from the dm_workflow table, get the r_object_id of the workflow:
select r_object_id, object_name from dm_workflow where object_name = ‘your work flow name’
2) Identify the notes that are carried by this workflow:
select r_note_id from dmi_package where r_workflow_id = ‘ the object id of the workflow’
3) Get the content id of each of those note ids returned:
select r_object_id from dmr_content where any parent_id = ‘the note id’
4) Go to DA, Administration->Job Management->Administration, use the “GET_PATH” method to find out the path of the files which stores the comments.
32. Query to get all documents expired in previous 1 month
SELECT s.r_object_id, s.object_name, DATETOSTRING(”r.a_expiration_date”,’mm/dd/yyyy’) as creation_date
FROM dm_sysobject_s s, dm_sysobject_r r
WHERE s.r_object_id = r.r_object_id
AND s.r_object_type = ‘dm_document’
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) >= 0
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) < = 1
AND r.r_version_label = ‘Expired’
ORDER BY 3
33. DQL to find all the folders in a Cabinet, where the folders are contentless
SELECT f1.object_name, f1.r_object_id, f1.r_folder_path
FROM dm_folder f1
WHERE FOLDER(’/Cabinetname’,descend)
AND NOT EXISTS (SELECT f2.object_name FROM dm_sysobject f2 WHERE ANY f2.i_folder_id = f1.r_object_id)
ORDER BY object_name
34. Find Super Groups and sub groups
select distinct r_object_id, group_name as super_groups
from dm_group_sp where group_name not in (select gs.group_name
from dm_group_r gr, dm_group_s gs
where gr.r_object_id = gs.r_object_id
group by gs.group_name
having count(gr.i_supergroups_names) > 1)
union
select distinct r_object_id, group_name as sub_groups
from dm_group_sp where group_name in (select gs.group_name
from dm_group_r gr, dm_group_s gs
where gr.r_object_id = gs.r_object_id
group by gs.group_name
having count(gr.i_supergroups_names) > 1) ;
35. DQL for finding all checked out documents in a docbase
select * from dm_document where (r_lock_owner is not nullstring or r_lock_owner ” or r_lock_owner ‘ ‘)
36.DQL to list the users who has access to particular folder path
SELECT i_all_users_names FROM dm_group
WHERE group_name IN (SELECT r_accessor_name FROM dm_acl
WHERE object_name IN (SELECT acl_name FROM dm_folder
WHERE ANY r_folder_path = ‘/folderpath’))
ORDER BY i_all_users_names
37. Query to find out what user signed off on what document
SELECT “audited_obj_id” FROM “dm_audittrail” WHERE
“event_name” = ‘dm_signoff’ AND
“user_name” = ‘tom’ AND
substr (”audited_obj_id”, 1, 2) = ‘09′AND
“time_stamp” >= DATE(’01/01/1998′, ‘dd/mm/yy’) AND
“time_stamp” SELECT object_name, r_version_label FROM dm_sysobject where any r_version_label in (’WIP’) and r_object_id not in (select r_object_id from dm_sysobject where any r_version_label in (’Staging’, ‘Approved’, ‘Expired’) )
39. Query to get all expired documents in previous month
SELECT s.r_object_id, s.object_name, DATETOSTRING(”r.a_expiration_date”,’mm/dd/yyyy’) as creation_date
FROM dm_sysobject_s s, dm_sysobject_r r
WHERE s.r_object_id = r.r_object_id
AND s.r_object_type = ‘dm_document’
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) >= 0
AND DATEDIFF(month,”r.a_expiration_date”,DATE(NOW)) < = 1
AND r.r_version_label = ‘Expired’
ORDER BY 3
0. Query to find the file system path location of a document
select doc.r_object_id, doc.object_name, MFILE_URL(”,-1,”) as mypath,doc.i_folder_id from dm_document doc
where
——————————————————————
Thursday, March 22, 2007
DQL Tips
————————————————————————————-
*** get CURRENT TIME on server ***
select DATE(NOW) as systime from dm_server_config
————————————————————————————-
*** get the implicit version label ***
select s.r_object_id,s.object_name,r.r_version_label from dm_sysobject s, dm_sysobject_r r where r.r_object_id = s.r_object_id and
r.i_position = -1
————————————————————————————-
*** include r_object_id to remove blank rows
select object_name, r_object_id, a_expiration_date from dfas_common where folder(‘/Raj Srinivasan’) and any a_expiration_date is not nulldate
————————————————————————————-
*** select documents with pdf renditions (optimized for performance) ***
select * from dm_document where exists(select * from dmr_content where any parent_id=dm_document.r_object_id and full_format=’pdf’)
————————————————————————————-
*** select all documents that have nulldate in repeating attribute
select object_name from dfas_common where folder(‘/Raj Srinivasan) and r_object_id NOT IN (select r_object_id from dfas_common where folder(‘/Raj Srinivasan’) and any a_expiration_date is not nulldate)
————————————————————————————-
*** select all documents that have nulldate in repeating attribute or a_expiration_date has past
select count(*) from dfas_common where folder(‘/content/Corporate Resources/Human Resources’,descend) and (any a_expiration_date <
date(today) or (r_object_id NOT IN (select r_object_id from dfas_common where folder('/content/Corporate Resources/Human Resources',descend)
and any a_expiration_date is not nulldate)))
————————————————————————————-
*** select folderpath with filename
select distinct s.object_name, fr.r_folder_path from dm_sysobject (all)
s,dm_sysobject_r sr,dm_folder_r fr where sr.i_position = -1 and
sr.r_object_id = s.r_object_id and fr.r_object_id = sr.i_folder_id and
fr.i_position = -1 and fr.r_folder_path like '/ChemNet/%'
order by fr.r_folder_path,s.object_name
————————————————————————————-
*** empty folders ***
SELECT r_object_id,r_folder_path FROM dm_folder f WHERE r_object_id NOT IN
(SELECT distinct i_folder_id FROM dm_sysobject WHERE any i_folder_id = f.r_object_id and folder('/content',descend)) and folder('/content',descend)
————————————————————————————-
*** NULL a_effective_date ***
select object_name from dfas_common where folder('/images', descend) and r_object_id NOT IN (select r_object_id from dfas_common where folder('/images', descend) and any a_effective_date is not nulldate)
————————————————————————————-
*** select component from workitem ***
select
r_component_id
from
dmi_package p
where
exists (select r_object_id
from dmi_workitem w
where
w.r_object_id = and
w.r_workflow_id = p.r_workflow_id and
w.r_act_seq_no = p.r_act_seq_no)
————————————————————————————-
*** select renditions ***
SELECT s.object_name, f.dos_extension
FROM dm_dbo.dm_sysobject_s s, dm_dbo.dmr_content_r c, dm_dbo.dm_format_s f
WHERE (c.parent_id = s.r_object_id)
and (c.i_format = f.r_object_id)
AND c.page=0 AND f.dos_extension ‘xml’
AND folder(‘/whatever’)
————————————————————————————-
*** find workflow given document ***
select * from dm_workflow where r_object_id in (select r_workflow_id from dmi_package where any r_component_id in (select r_object_id from
dm_sysobject (all) where i_chronicle_id in (select i_chronicle_id from dm_sysobject where r_object_id=”))) and r_runtime_state=’1′
————————————————————————————-
*** return only inherited attributes ***
SELECT attr_name FROM dmi_dd_attr_info WHERE type_name = ‘my_custom_type’ AND attr_name NOT IN
(SELECT attr_name FROM dmi_dd_attr_info WHERE type_name = ‘dm_document’)
————————————————————————————-
Documents that are uploaded in to docbase b/w Aug 2004 and Oct 2004
select a.r_object_id,a.r_creation_date,a.r_modify_date,b.user_group_name
from dm_document a, dm_user b
where (a.r_creation_date >= Date(’08/01/2004′,’mm/dd/yyyy’) and a.r_creation_date 0
————————————————————————————-
Subject: Why do we create four views for each subtype?
Note: For example the type dm_document has four views:
dm_document_sp
dm_document_sv
dm_document_rp
dm_document_rv
The two _sp and _rp views are used by DQL and the two
_sv and _rv views are used by the Object Manager.
Also, the _sp and _sv views are for single (non-repeating) attributes, while the _rv and _rp views are for repeating attibutes.
————————————————————————————-
Label Text of the either Sytem Type or Custom Type
select label_text from dm_nls_dd_info where parent_id in
(select r_object_id from dm_aggr_domain where type_name = ‘field_type’)
Results:
Content Location
Keywords Category
Business Unit Owner
————————————————————————————-
DQL to list all documents attributes and their associated folder path
select s.object_name, fr.r_folder_path
from dm_document s, dm_sysobject_r sr,
dm_folder_r fr
where s.i_is_deleted = 0
and sr.i_position = -1
and sr.r_object_id = s.r_object_id
and fr.r_object_id = sr.i_folder_id
and FOLDER(‘/ChemNet’, descend)
and fr.r_folder_path like ‘/ChemNet/%’
order by fr.r_folder_path,s.object_name
————————————————————————————-
*** Web cabinet of a content ***
SELECT object_name FROM dm_cabinet
WHERE r_object_id IN (SELECT i_cabinet_id FROM dm_folder
WHERE r_object_id IN (SELECT i_folder_id FROM dm_document (ALL)
WHERE object_name like ‘test%’)) AND r_object_type=’wcm_channel’
OR
select r_object_id, object_name from wcm_channel where r_object_id in
(select i_ancestor_id from dm_folder where r_object_id in
(select i_folder_id from dm_sysobject where object_name = ‘test’))
————————————————————————————-
*** To get the first level folders from the cabinets ***
select object_name from dm_folder where any i_folder_id in (select r_object_id from dm_cabinet where object_name=’Cabinets’)
————————————————————————————-
*** To show the previous Active content ***
select r_object_id,i_chronicle_id,DATETOSTRING(DATE(TODAY),’ddmmyyyy’) as sysdate from dm_document (ALL) where object_name like ‘test%’ and
FOLDER(‘/ChemNet/ChemonicsProcess/Bidding’) and
any r_version_label = ‘Active’
————————————————————————————-
To find the folders for particular group for specified permission
select for write object_name from dm_folder where acl_name IN (select object_name from dm_acl where any r_accessor_name = ‘dm_world’) and folder(‘/ChemNet’,descend)
or
select object_name from dm_folder where acl_name IN (select object_name from dm_acl where any r_accessor_name = ‘dm_world’ and any r_accessor_permit = ’7′) and folder(‘/ChemNet’,descend)
1 – NONE
2 – BROWSE
3 – READ
4 – RELATE
5 – VERSION
6 – WRITE
7 – DELTE
————————————————————————————-
DFC to insert rows into registered table
public static IDfCollection execQuery(String queryString, IDfSession session)
throws DfException{
IDfCollection col = null; //Collection for the result
IDfClientX clientx = new DfClientX();
IDfQuery q = clientx.getQuery(); //Create query object
q.setDQL(queryString); //Give it the query
// example queryString: “insert into dm_dbo.your_registered_table
(field1, [field]) values(,[
col = q.execute(session, IDfQuery.DF_EXEC_QUERY);
System.out.println(“Query executed.”);
return col;
}
————————————————————————————-
How to avoid redundancy for this simple query?
select distinct d.object_name,sys.authors from dm_document d, dm_sysobject_r sys
where folder (‘/xyz/xyz_first’) and
d.r_object_id = sys.r_object_id and
(sys.i_position=-1 or (sys.i_position< =-2 and sys.authors is not null))

Link: http://dionrobin.wordpress.com/2010/02/08/useful-dql-queries/

看看人家是怎么读书的

读完这段讨论文章,深有感触,惟恐日后不得见,故全文转载如下
——————————————————-

此贴常看常新,获益良多。故稍作编辑,转载之。

chaque按:

1) 乔纳森此文原载于南方都市报读书版。

2)作者乔纳森(不少朋友知道他的真名,此不赘),在文前谦称“三无人员”,其实早在十几年前就是水木清华论坛上有名的学士、思考者和文体家了。其后在网易论坛、往复论坛、天涯论坛等地也经常发文(计有乔纳森、水木乔纳森、Johnathan等ID),所作多为名帖。

3)根据文中所述内容统计,乔纳森先生为理解《叶隐》究竟是怎么回事,在5个月内的时间中,穷尽式地阅读了中日英文总共16种相关著作。虽然作者自己调侃说这个写作计划最终“完败”,但我们反倒可以从中看出这一代作者在研究投入上的热情忘我、在资料掌握上的扎实严谨、在文献解读上的娴熟细致。在我看来,这些是此前很多著书立说的研究者远远不及的。比如我最近看到若干作者,只找到了几部英文的拉康著作,就以为“在资料上达到了国内的最高水准“,甚至写下了大部头的论拉康专著。比诸乔纳森先生的善藏拙,这些率尔操觚的“学者”实在应该好好反省一下了。

4)此前似乎有本坛网友以为我这个ID是乔纳森先生的马甲,这在满足了我的虚荣心之余,却肯定会让大家严重低估乔纳森先生的写作。就借此转载声明一下,希望能够彻底打消残余在各位乃至我本人身上的错觉。

读的葛藤,写的完败
乔纳森 2008-01-21 08:59:44 来源:南方都市报

(乔纳森,无头衔,无著作,无影响,属“三无人员”。自2004年起,为《南方都市报·阅读周刊》撰稿。专栏系列包括“西书识小”、“映画书志学”等。)

“葛藤”是禅宗语录里常见的词,后来我们不用了,日语里还有,意思相当于现在说的“纠结”,但更形象些。至于“完败”,也许不用多解释了,常看体育报道的人都晓得,就是“大败”的意思,但它似乎比“大败”还“大”一点:是完全的、彻底的失败。

2007年,就我的阅读和写作生活而言,是葛藤的一年,是完败的一年。

这一年,旋风似的读书,一路风行草偃,然而大风过后,草木齐齐直起腰身——读是读了,可读的都是书皮儿,内容盘踞书中,不曾挪动。写作计划一个接一个破产,其实早在制定计划的当口,已然没了完成的决心。如果说多少还写下了什么的话,也不过如草蛇灰线,曲里拐弯地证实自己如何避难就易、如何见异思迁。

在所有破产的计划当中,牵扯最多、延宕最久的要算关于《叶隐》的那个。2007年5月,李冬君先生翻译的《叶隐闻书》(广西师范大学出版社,2007年第一版)出版,外间的评说毫无批判性地一边倒,读着未免气闷,遂暗下决心,打算好好将《叶隐》的系谱清理一遍。

读《叶隐》,当然不能只读译本,于是找来了“日本思想大系”里相良亨的校注本(《三河物语·叶隐》,岩波书店,1974年第一版)——译者也正是以此为底本的。参照校注本,可对翻译上的细节有更准确的认识。读完了本文,当然还要参考近人的解读,于是找来了三岛由纪夫的《叶隐入门》(光文社,1967年第一版),一读之下,发现三岛君的解读竟是对原著的剪裁、芟夷、拼贴,美化效果之显著,殊不逊于电视上整容广告的宣传口径。将山本常朝的原著与三岛由纪夫的导读两相对照,从前者的肆言无忌与后者的片面呈现的对比出发,剖视武士道逻辑的颠倒淆乱,不是能写一篇漂亮的文章出来吗?就这样想着,浩繁的准备工程启动了。

三岛由纪夫其他的作品不能不参考,比如中译本“三岛由纪夫作品集”《残酷之美》(中国文联出版社,2000年第一版)一卷,在《日本的古典与我》一文里,就有“我把《叶隐》作为我人生的老师,它对我来说是一部十分重要的书”这样的话。紧接着,又找来了三岛的《行动学入门》(文春文库,1992年版),这是他发挥自己的“《叶隐》哲学”的著作。顺便,把John Nathan写的英文版《三岛由纪夫传》(Tuttle,1975年第一版)读了——关于《叶隐》的内容,在第223至224页。又顺便把宫崎正弘的《三岛由纪夫“以后”》(并木书房,1999年第一版)翻了翻,对三岛倡言“《叶隐》哲学”时期的日本知识界氛围有了更深的认识。

既然要谈武士道哲学,对武士道本身,当然要了解充分。新渡户稻造的《武士道》(商务印书馆,1993年第一版)早就看过,为了更好地重温,就把志村史夫写的《新渡户稻造〈武士道〉导读(三笠书房,2003年第一版)翻了翻。尽管帮助不大,但我还是将武士生活研究会编的《近世武士生活史入门事典》(柏书房,1991年第一版)和北山茂夫写的《中世的武家与农民》(筑摩书房, 1982年第一版)也浏览了一下。简单明快的叙述出现在森川哲郎的《日本武士道史》(日本文艺社,1976年第一版)中,第三章《武士道哲学的确立期》讲的就是《叶隐》。

《叶隐》的核心内容是对死亡的看法,尤其是对以切腹为代表的自杀方式的看法。因此,我又参考了法国学者 Maurice Penguet写的《自死的日本史》(筑摩书房,1992年第一版)和苏格兰学者Stuart D.B.Picken写的《日本人的自杀》(Simul出版会,1979年版)两种日文译本。《自死的日本史》第九章《残酷剧》有对《叶隐》相当深入的探讨,这个法国人真了不起。

至于边缘的文献,如《留给日本的遗言:福田恒存语录》(文春文库,1998年第一版)中一段谈《叶隐》的文字,就很可以作为右翼知识人见解的代表。源了圆的《义理与人情》(南开大学出版社,1996年第一版)里讲赤穗四十七浪士的一节,也对我观念的形成有不小的启发。此外,片言只语提及《叶隐》的,多的是,也不必再开列了。

等我的终于在去年10月底接近尾声,媒体对《叶隐》的兴趣似乎也降至冰点,自个儿是千言万语奔到嘴边,一时间又不知从何说起。罢罢罢,不写也罢,了不起在一长串破产的写作计划后再添上一笔。葛藤是完败的根,完败是葛藤的果。道理不是不明白,但那个能出手划断葛藤的人究竟在哪儿呢?

chaque评:

(1)

哲人王兄、醉兄的读法是博雅的精细阅读,Johnathan先生在本文中展示的是专题的调研阅读,这两种模态、样式,当然不能放在一条跑道上比赛。

我感到遗憾的是,目前国内很多专题研究者的成果,既欠齐备、也不专深,只相当于把国外该领域入门资料读完了的水平,而且还都能由商务印书馆之类的名牌出版商印行。如果所有文科博士论文都由乔纳森先生行使一票否决权,那么我们的书店里应该能够清净整饬不少了。

赞叹归赞叹,我觉得咱们还是应该争取从Johnathan先生的这篇文章中学到东西。否则就只相当于看了看满汉全席的照片,自己可没沾着丁点儿好处。

总结Johnathan先生的大作,我以为可以看出他的读书方法有这么几个特点:

1)为写而读。读的目的和归宿是写出东西;对于他这次“叶隐计划”,大概就是为了写一个新出版译著的书评。

2)成计划地读。按照“写作计划”安排每年的阅读。就好比把每年要看的书组成了若干个纵队,具体的阅读中这些“纵队”肯定又可分可合——读书法如行军法,运用之妙自然是存乎一心的。

3)合理规划专题书目。对于每个“计划”,要规划出专题书目。这就要求所谓“计划”不能涉及太广,比如您今年的计划要是“世界文学”,那么八成还没到“葛藤”就已经“完败”了;也不能范围太小,因为毕竟不是研究所里的课题研究,如果您定下了“三岛由纪夫剖腹刀法研究”这么个题目,那么倒是切实可行了,但可参照的书太少,恐怕三两下子就看完了,打穿了,不能满足持续阅读的兴趣。在一组专题书目里,当然应有主有次,有泛读有精读,有原始文献,有研究者的介绍导读。这相当于打向计划目标的组合拳。

4)建立图书获取渠道。虽然规划出了书目,如果找不到书,那也是白搭和完败。所以要有固定、成熟的图书获取渠道。比如拥有说好的大学图书馆、地方图书馆,比方说经常能旅行,或者托朋友在目标国购书,比方说您自己就开一家外文书店,再比方说跟各地书商、网上书店都保持良好的购销关系。据我所知,Johnathan先生不看电子书,谈到的书基本上都是自己购置。做到这一点,恐怕对不少朋友来说有点儿困难了。所以说到阅读的水准,决心和投入也是关键。

5)不畏烦难,直面原文。前面说了这么多,可还都处于配菜阶段,虽然也算是挺麻烦的了,但更要紧的还是最后下锅翻炒的功夫。宋公明和戴宗、李逵在酒楼上吃醉了要喝鱼汤醒酒,店家端上汤来,宋头领一尝就知道是隔夜剩下的鱼,腌过后做的。那些只读二手资料或者蹩脚译文而讨论原书的人,写出的文章就像这隔夜的鱼汤,输入既然不好,产出就没法不露马脚。我们佩服的陆兴华先生也写过“阅读的政治经济学”之类的文章,强调原文阅读看似费时费力,在实际效果上可是划算得太多。据我不完备的统计,Johnathan先生至少研读过英、法、意、拉丁、日、德等语言的原文文献,他的写作成绩这么好,与阅读时培养的语言敏感性和解读能力肯定是分不开的。

6)最后,还有善于藏拙。Johnathan先生虽然读得多、想得深、写得精,但至今也没出过一本专著。他在历年的“写作计划”投入的功夫是不是就白费了呢?我看肯定不会的。就以这个《叶隐计划》为例,哪怕是最后一个字书评都没写出来,也给我们留下了这篇宝贵的《年度读书小结》,供大家揣摩取法。单是这个成绩,让我说的话,就远抵得上国内拉康研究的全部几千几万页废纸了。

(2)

这次结合Johnathan兄的“读书小结”重读大作,我又有两个新的感想,还是趁吃晚饭前写下来,跟大家探讨吧:

1) “读多少种书才算合适,才算把书读完”的问题,是一个有缺陷的问题。缺的是两个字:”目的“,为了不同的目的,对这个问题有不同的回答。出版社的校对、印刷厂的质检员、新闻出版管理部门的审查官,每年读书的数目恐怕是我们没法梦到的——但我们不羡慕他的多,没别的原因,目的不同而已。

明乎此,咱们就得在“该读多少书“之前,加上“为某某目的”这个限定;如果根本没目的,只是为了阅读之乐而读呢?那当然也用不着计数儿,跟质检员相同,总之越多越好呗。

所以在”为读而读”之外,出于不同的目的,需要读书的数量是不一样的。哪怕同样是出于研究的目的,针对不同的学科,需要的阅读量也不一样。

如果有人问,做个“万事通”要读多少书才成?那我只好说,万事通的必需读书量还是跟质检员一样,是没限定的。所谓“一事不知,儒者之耻”,万事通这个标准的本意是“掌握了一切学科的一切知识”,当然对任何东西,都该不加歧视、泥沙俱下地读一遭儿。

在知识爆炸的年代,万事通这个岗位压力太大了,即使缩小点儿范围,做个“文史哲万事通”也很困难。硬是立志做“万事通”的人,往往就要花两个代价:第一个是肤浅,第二个是势利。”肤浅”很好理解,求广就很难求深。所谓“势利”,就是说现在的万事通,大多要大刀阔斧,芟夷掉很多自己能力之外的领域和方向;为了给自己的辣手删砍找个理由(justification),就不得不像暴发户对待穷亲戚一样,看人下菜碟儿,我看不懂的东西,就说它没有用、水平差、档次低好了。所以当今万事通的读书法,往往是皮鲁士式的胜利(a Pyrrhic victory)。

万事通对知识,本该有天下最积极、最热忱的态度,尤其新知识应该是来者不拒的。但是实际上我们遇到的这类人,却常常是读书人里最保守的一类,崇尚知识的几个基本源头,对全新的东西反而不屑一顾。原因无他——新东西会在刚刚平定下来的版图中引发叛乱,好不容易整理出来的“下菜碟”价目表,因为新知识的加入又得重新调整了。

2)在很多专门领域的阅读,难度首先来自书目规划。这是个著名的诠释学循环:为了入门,先要规划阅读的书目;但若是你能选对书目,其实你就已经入门了。

听老人讲,从前柬共打江山的时候,抛头露面都是乔森潘,外界都以为他就是一把手了,等政权坐稳,大家才发现真正掌舵的是波尔布特。外行给自己开列书目的情形大体也是这样,抓住的大多是学科中的“乔森潘”,遗漏了、忽视了角落中的波尔布特。表面上这些都是小人物,是除不尽的小数点儿,其实呢——我们了解过任何学科实情的人都知道——很多表面不起眼的著作是绕不过去的,势利的万事通读法,恰恰是因为怠慢了这些显赫的穷亲戚,所以不得不付出肤浅皮相的代价。

所以规划书目最好的途径,大概不是借助读秀网站或者任何“名家推荐”,而是走到像样的图书馆或大书店里,实际闻闻书味、摸摸书皮、掂掂分量、翻翻页码(而不仅仅是目录),无论重要的不重要的著作都拿在手上摆弄一阵子。换言之,一本书的神秘核心是它的物质性因素,缺乏这种跟书本的最直接亲近,你就和相关的书本家族永远也混不熟,永远处在把二线傀儡当成波尔布特的窘境之中。

书目规划的诠释学特征还在于,你不可能一劳永逸地决定,哪些书该读,哪些书是不该读的。“从一开始就做好规划”尤其是个天真的想法。随着阅读进程得到更新的,是先前的个别判断,是整体的估价视野,甚至是阅读的目标本身。所谓“矛伤尚待矛来医”,只有通过读,才能知道读什么、怎样读。把先期的书目规划视为一个脱离其后实际阅读过程的超验原点,就肯定会错失了读书这件事的部分、乃至全部真理。

Johnathan先生的这次读书小结中,就体现出了他在这两个方向上的强调:第一,“写作计划”事实上是阅读计划,是“带着明确的目的和问题读书”。第二,通过大量接触相关图书,他自然地、迂回渐进地达到了跟主题的“亲熟”。他大作中的每个自然段,也就标明了航程的每个新阶段,那真是“每下愈况”,最终洞悉了对《叶隐》的”相当深入的探讨”。他的这次阅读规划、阅读进程,洋溢着对意想不到的新事物的热爱,以及对从异域中寻回自身的自信。

罗嗦了这一大篇,大都是人所共知的道理。好在晚饭又要开始了,废话再多也只能如此收场啦。

(3)

吃饭回来重读帖子,感到哲人王兄的“核心著作”一说确实是不刊之论。目前由于国内学科建制的不成熟,很多研究者只读了某领域最时新的几种作品,就敢于著书立说,作出推倒一世豪杰的宏论来。这是相当可悲的。因为这样的研究者,往往忽略了他见到的那些作品与本学科传统著作之间动态的对话关系,在最教条、最抽象的意义(无论是肯定的,还是否定的)上理解传统。因此他的著作,大体恰恰是陈词滥调的借尸还魂,不仅未见新意,而且与他最想回避的旧学中的糟粕部分不幸地重合了。

另一方面,我以为“读核心著作”大概只能算是了解一个学科的必要而非充分条件。读过这些基本著作,好像是对敌方的火力部署侦查得差不多了;但是要说战而胜之,那可还差得远。这时就认为自己已收全功,可以鸣金收兵了,相当于说“侦察连就是整支部队”、“望远镜是终极武器”。因为正如刚才所说,很多学科的一个主要任务,就是跟本学科传统进行持续有效、不断更新着的对话,通过新视野来激活旧传统,又通过对传统的再阐释来重新理解当下的处境;换言之,在学科演进之中,“核心著作”本身就是在不断被重估、被赋值着的。只有加入到这个对话中的人,才能充分体认“核心著作”的意义。这就好比谢逊让张无忌从小就熟背了七伤拳谱,但是只有到张自己临阵演练,才能明白某招某式原来是这么用的。相信“核心著作”有着一劳永逸的现成价值,无异于指望拳谱背诵家成为武林盟主。而由核心著作衍生出来的很多研究专著,在这个意义上就特别可贵:通过它们,我们就更容易进入到在传统与当下之间富有成果的对话之中。

往往情况是这样的:比如说有按照年代先后排列的A、B、C…等著作,比如我们也计划依次读下来,但读过了C,我们才发现它赋予了A、B全新的理解语境,也就是说,后来的C反而成了A、B的理解前提。这就像马克思常说的“人体解剖是猴体解剖的入门钥匙“一样——A、B和C之间有了互为前提的关系,在不读A、B就读不懂C的同时,不读C也读不懂A或B。换句话说,无论我们先读了其中的哪一种,在读了另外一种之后,我们还要重新评估原先的读,甚至在A< ->C这个回路中无止境地反复运行下去。一部作品越是”核心著作”,以下命题就越是成立:对它来说,不存在读,而只存在重读。

“核心著作”之所以能推动学科的发展,一个重要原因就在于它质疑、瓦解了人们既有的视野和评价体系,为本学科的学术版图重新绘制了一遍等高线。但这些著作也很容易被教条化,被后来的、后世的研究者出于教学传授目的,浓缩成干巴巴的两三下子,狠呆呆的几条公式。这就把原先动态、激进、鲜活的内容给圈养了、驯服了、试题化或教义问答化了。很多人看学科名著,哪怕是第一手地,直面原文地读,也脱不开这个套路。这大概是因为他们早就受到了各种入门导读、门徒手册的影响,因此不能见证原作者带来的破晓,只看到了介绍者从前让他看过的东西。这就像对读惯了旅游指南的游客来说,到指南上有照片的那几个地方拍照就是旅行的全部意义。所以我常觉得,学科名著至少要读两次,而如果非要读“名著导读”一类的书的话,时间最好就安排在这两次阅读之间。记得Johnathan先生曾说,有些介绍性著作其实是“印证书”,能够让读者确认自己的阅读是否到位,就好像我们在陌生的城市中游逛的时候查看地图。我以为这个道理,正如我从Johnathan先生那儿学到的大部分东西一样,是平实而深刻的。

(4)

哲人王兄所言不错,读书当然不是非要什么目的不可,您提到的几位更是我一直仰慕的对象。我在前面的论点只是:“无目的读书,就不用考虑数量。”因为没有需要达成的目标,伯恩施坦所谓“运动就是一切”,当然更不必计量考察了:-)

非常佩服哲人王兄这个阅读的境界。福柯在晚年(《性史》、《主体诠释学》中)曾说过,古代人和东方人,跟真理之间有一种特别的、不常见于西方近代的关系。近代人求知,通常是把自己视为外在于真理的认知主体,知识的增进并不意味着主体的提升;而古代/东方人的求知,则把获取真理的过程看作是一种内在于、同步于主体自身的精神的修炼、自我的技术(spiritual exercises, culture of the self)。这个技术当然不仅仅作用于头脑,更要紧的就是要对身体的关注跟训练,甚至把人的整体生命当成一个艺术品来塑造。哲人王兄上面的帖子,就让我感受到了这种不让古人的气度——相比之下,我这样的闲读就像是逛大街之于练气功,冰激淋之于人参汤,只能算是人类精神实践中一个严重退化的品种了。

我突然想到了一个阅读的倒金字塔:求道>求学>求术>求生>求趣。

像哲人王兄的读书,庶几可谓”求道”了!除我之外的所有学士,当然至少都达到了“求学”的标准!凡是能够学以致用、读书发财的各位,大概都当得起”求术”这两个字!海德格尔说,理解首先是生存论的筹划,所以基本上所有本真的读(不管是否发财与否)首先及通常都是一种“求生”!——而对于我这样非本真的读者来说,最合适的名目恐怕就只有”求趣”了,而且正如winwun兄评定的,基本上还都是”记丑而博”的恶趣!

(5)

哲人王兄这几个比喻生动极了!可惜时间不巧,您筹划的那么多题目都只成了存目,给我们这些饿汉看见了菜谱就收了席!

哲人王兄说到“隐微的目的”,让我也很有感慨。我们工科人员善于做的就是解题,所以通常是先明确目的,再确定方法,然后规划进度,最后解决问题即可。哪里知道,这个思维模式只在“求术”、“求生”乃至“求趣”这几个水平的阅读中才管用,对于“求道”跟“求学”根本就不是那么回事呢!

apollon兄总结得好,我是“求趣”之人,前面忝颜强说“求术”乃至“求学”,而哲人王兄呢,本来是最精于”求道”的,居然在这里迁就我很久,早该让我愧生颜变、“汗不敢出”才是。

前面的”阅读的目的理论”,从这个视角的观照下我觉得应该这么修正:

求趣者,随处即是阅读目的;求生者,自然以有益于生存为阅读目的;求术者,以完善专攻之术为阅读目的;求学者,以学问有所成为阅读目的;求道者呢,还如哲人王兄所说的,以养气、练气为阅读目的!唯气之为物也,至大无边,玄妙无常,所以作为阅读的目的,表面上简直也是个“无目的”,更不足为外人轻道了。

apollon兄既然敏感地察觉了这几种阅读在“层次”上的差别,居然还强令我们“统一思路”,这不啻于让航母跟皮筏协同作战、把废柴和赤金融于一炉,几乎是出现吉尔伯特赖尔所谓“范畴错误”了。您提到的英法德三国比较,让我想到Deleuze跟Guattari在《什么是哲学》中对尼采的“地缘哲学”一说的发挥。他们想到的正好是英法德这三国,考察了各国的哲学跟“土地”之间的关系。其意略云,法国人爱当地主,对土地就是丈量、利用、收租子;德国人呢,则不爱守成,他们最喜欢做的是重新征服土地,给土地“奠基”;英国人在这些作者眼里则是惯习和居住的民族(惯习和居住在欧洲语言里有同样的词根,比如拉丁文habitus),他们最容易和土地融为一体,达到自然无碍的态度。apollon兄说到三国在“核心书目”上面的区别,我觉得正可以拉这一段“地缘论“做援军。书从广义上说,也是从土里来的,所以各族对书目的态度,大概也就来自他们跟土地的关系吧。

哲人王(vivo)补充:

按照V的说法,文学的感受、读解方式和其他人文社科不同,文学是尽量繁复的发散性书写,而其他基本是力求简省的收敛性书写,它们只有有限的一些基本类型,于是,只要把里面具有代表性的一些典范作品掌握,就可以得其精髓,依然举政治学的例证,首先要明白《理想国》、《政治学》、《君主论》、《利维坦》、《论法的精神》、《政府论》、《社会契约论》、《正义论》、《无政府、国家与乌托邦》、《认真对待权利》等都是所有政治著述无法回避的“大品”,它们是政治话语的起点、是典范类型的代表,一个人切实理解了这些著作,再读其他依附性的稗贩式著作,自然会高屋建瓴、势如破竹,极端一些甚至可以不读二手著述,因为它们都推演可知。

历史有点奇怪,它也是细节式的趣味,但作为中国人,基本的阅读著作就是尚书、左传、国语、战国策、资治通鉴、二十四史等,如果不按照册数而按照品种论,也没有超过50种。

而文学不一样,不同作品之间没有强烈的替代性,不能说读过李白杜甫白居易就不用读曼殊大师和郁达夫的诗,读过《水浒传》《基督山伯爵》就不用读金庸古龙,它的流衍扩张有足够复杂的可能性,每一种都会给人截然不同的感性、景观和视野。然而,文学的流变也不是说有无限的类型,依照结构主义的说法,在它的底层,也隐隐可见一些原型(archetype)。在生命时间有限的硬约束下,阅读800-1000本文学书绰绰有余,当然,这里说的也是比较硬的核心著作。

Apollon所言甚是,《共和国》、《上帝之城》、《论君主政治》都是比较有典范性的核心著作,V的设想里,西方政治学的硬核大约有50部作品,还有潘恩、柏克、托克维尔、亨廷顿、哈耶克等等,上面为了叙述简洁,就用“等”代替之。

不独政治学、历史、文学,哲学、宗教、法律、经济学也都有自己的大品谱系,名单很容易找到,问题就在于我们有没有兴趣、心力去阅读。

chaque兄每有言说,皆云蒸霞蔚、胜义纷披,令人受用无穷。不过呢,智者千虑,必有一失,V仔细想一下,也不是没有驳难的余地,尝试在此申辨一二:

A、读书不一定要有明确的目的,比如Johnathan一样写作决定了的阅读,比如为了在课堂上给学生教授而决定了的阅读。我们恐怕幼时读闲书最起劲、最酣畅淋漓、最有生命的乐趣,但其时并没有什么显而易见的目的、计划,但这些阅读,却在一定程度决定了我们此生的情感感受方式、思维运作方式,他们是身体式的阅读,囫囵吞咽到胃里,消化后就长在我们肉里。慢慢一个人成熟,读书时考虑的外在因素强化,就可能会把把下咽的精神食品变成在喉咙间吞吐的香烟,嘴里吸进来一团雾鼻子里喷出去一团烟,只有极少数沾润到肺。Johnathan是在自谦,说“旋风似的读书,一路风行草偃,然而大风过后,草木齐齐直起腰身”,但对海量功利性比较强的阅读者,像毕业论文写作者、急于评职称者、焦虑于在媒体成名者,他们的情形据V观察就是如此,浮光掠影、蜻蜓点水,只求快速在书本找到对自己写作有价值的东西,而不能做一个安静的耐心的聆听者,充分汲取作者言说里的每一滴智慧。他们和文本的亲近是水油关系,而不是水盐关系。因此,我们在阅读的时候有时恰好要取消而不是强化目的性,以追求无目的的合目的性,和kant老人家说的审美一样,让读书成为自由的游戏。V的一个朋友“维舟试望故国”,博学好思,影响广泛,想必chaque兄也知道,有一次大家在一起聊天,有人就问他为何读书,他的回答很干脆,没有什么目的,不过是喜欢,而写作呢,也仅仅只是自己的娱乐,所以会很学术地写金庸武侠历史学研究这样反讽的游戏文章。他的阅读目的并不如Johnathan明确,但却也在写作上取得了类似的成就。

B、再详细阐释下前面所说的身体性阅读的概念。V有时貌似喜新厌旧、时尚、八卦,譬如喜欢的杂志是《ELLE》和《外滩画报》而不是《读书》和《万象》,譬如最爱的地方是迪厅酒吧而不是书店茶馆,譬如常常不厌其烦地把Acrobat、ABBYY FineReader、ACDSee升级到最新版,但有时观念又会非常正统,比如认为读书的主要目的不是写出什么鸿篇巨制,而应该是养气蓄志,基本也类似于陈老所言:“士之读书治学,盖将以脱心志于俗谛之桎梏。”所以,阅读的过程希望是让词语、段落震荡心灵,心灵生产温暖的血液,同时把血液运送到四肢百骸的过程,它给人气度、血性、涵养,成为行为的维生素,可以让自己待人接物温和宽容明敏坚强,附带能在言说书写上给予什么识见、学问、逻辑、情感、文采,都不是那么重要。简洁一点说,读书主要是给日常行动的肉体充电,而不是给言谈书写雪中送炭、锦上添花。坦率地讲,V自小有点是问题儿童,戾气重,我行我素,放诞乖谬,因此成长过程中一直在寻找自我疗救的方法,有时是彻底心灰意懒,有时又想稍微飞扬振作,当V再次返回校园的时候,导师问来读书的目的是什么,V说的是“养气”。此情此景在有的人看来会觉得可笑荒诞,却是V当年发生的事实。

C、身体性阅读还有一层意思,要把由阅读得到滋养的气和生命本身的气、生活经验带来的气合并在一起,来共同形成个人的能量场,如果一个人还去写作的话,用整个肉体和精神熔炼在一起的能储去书写,而不是去轻巧地摆弄把玩暂时过耳过目的词汇、风景、事物。鲁迅的《野草》,气魄之澎湃、意志之决绝、情感之激烈、色彩之秾艳,远远为周作人、张爱玲之流莫及,V相信这是因为鲁迅是在用听起来有些神秘的肉体精神综合气场在书写,而不是其他人相对单纯的知识式生活经验式写作。鲁迅的阅读具有身体性,所以他的写作也具有身体性,呈现着赤身肉搏的激烈、残酷、高昂,惊魂动魄。

D、某一具体文章上目的的残缺,或者在整体言说中目的的残缺不等于内在目的的残缺,即使有所说明,名义上的目的也不等同于实质上目的、隐含着的目的。出于一种策略上的考量,我们有时的确需要施特劳斯魔眼所发现的“隐微写作”,掩藏主要意图。比之于行军打仗,你不能在百万雄师横渡长江成功之前就把渡江的时间、地点播报全国,而是要完胜之后再发新闻稿。也可以举恐怖主义袭击的例证,他们素来神出鬼没,总是在把人炸得血肉模糊之后才通过某些渠道宣称由某某组织负责。记得有一个年轻学子几年前就宣称要在三年内成为学界领袖,结果,比三年还长的时光已经消逝,他有没有成为学界领袖呢?目的、目标的首先宣称就会把自己置于受限制的被动地位,或者非常危险,或者日后会成为被他人讥讽的把柄、笑话。说和做有如下几种关系:不说不做、既说又做、说了不做、做了不说;先说后做、边说边做、先做再说。V觉得比较优化的组合应该是既说又做但要先做后说。做是可以直接看见的行动,说却要通过语言、文字迂回到达他者的思维。维特根斯坦在《哲学研究》里说:不要去想,而是要去看!想总纠葛着思维、文字,而被意识过滤过的文字除了可以表露、彰显、澄清、限定事实外,它同时具有扭曲、粉饰、遮掩、颠倒事实的功效。于是,我们常常需要搁置且跨越语言、文字的迷雾,直击事实,面向实事本身(zu den Sachen selbst!)通过隐微曲折的行动线索去追踪、还原可能的主要目的,怎么做总比怎么说泄露更多的内在秘密。

针对chaque兄的指教,V筹划的回复还包括:1)如何重新定义万事通,2)阅读的势利,3)新知识,4)破解诠释学循环,5)书目规划怎样可能,6)要不要和书本亲熟。没想到只答复“阅读目的”一个话题,就已经写下大量滔滔不绝的废话。自思无甚高明之见,当前又近年关,冗务猬集,只能做出决断,把自己的筹划取消,说这么点供诸贤一哂即可。

“求道、求学、求术、求生、求趣”的阅读类型学研究实属高论,基本把读书者常见的心态包罗殆尽,但是在高下层次的划分上,V稍微有点不同意见。最强烈的主张是“求道、求学、求术、求生、求趣”全在一个层次上,没有高下之分。既然全都是“求”(同时求不得),当然是贪嗔痴三毒之列,就不复有层级的区别;如果实在要分出个高低,V觉得它们的次序大概是:求生>求趣>求术>求学>求道。越往前越切近于生活、生命的真实,越靠后则越凌虚蹈空,远离此在的本真。