日期:2014-05-17  浏览次数:20707 次

如何一次性取出某个表的10条记录,而这个表的字段包含clob大字段
表   article   有一个info   大字段列,存储的文章的详细信息,现在要用sql语句取出10条记录,并且包含大字段info的前100个字符

如何写这个sql语句,并且操作以后能释放大字段的(游标或是指针)?

现在用   SELECT   *   FROM   v$open_cursor   查看打开的游标发现很多类似这样的东西

table_4_200_76f3_0_0_0
table_4_2000_769c_0_0_0

网上说是大字段周围的指针,上面那个东西持续增加,是我连接数过多,怀疑是取错误操作大字段造成的

下面附网上的原文章,这样的问题应该如何排查呢?


V$OPEN_CURSOR中奇怪的项    
   
为什么V$OPEN_CURSOR.SQL_TEXT以 "table_4_xxxx_x_x_x_   x "的形式进行显示?V$OPEN_CURSOR中的多数项都与此类似。我的数据库客户机是Oracle8i   8.1.7版的JDBC瘦驱动程序,操作系统为Sun   Solaris   8。例如:    
   
select   user_name,   count(1)   as   count,   sql_text    
from   sys.v_$open_cursor    
group   by   user_name,   sql_text  
order   by   count;  
USER_NAME     COUNT     SQL_TEXT  
---------     -----     ---------------------    
ORACLE     1     select   user_name,   ...  
SGMASTER     1     SELECT   PROPERTY_N...  
SGMASTER     5     INSERT   INTO   ...    
SGMASTER     7     table_4_200_5ee2_0_0_0  
SGMASTER     12     table_4_2000_5ed8_0...  
SGMASTER     12     table_4_200_5ed8_0_0_0  
SGMASTER     12     table_e_400_5ed8_2_0_0  
   
这些项与LOB周围的隐藏指针相连接。当你有一个为读/写而打开的LOB时,你会在V$OPEN_   CURSOR中发现这些神秘项中的一个。利用嵌套表也可以看到它们(在创建或访问时)。    
   
在这种情况下,看起来似乎你的所有项都是LOB指针。带有TABLE_4_*的项表明打开的LOB是用于读取的,而带有TABLE_E_*的项表示打开的LOB是用于写入的。考虑清单   2中的例子,它是一个为读取而打开的LOB,而清单   3中的例子是为写入而打开的LOB。    
   
在清单   3中以WRITE模式的例子可以看出,TABLE_E项出现了。有趣的是,SQL_TEXT中间的数字(在本例中为9912)实际上是以十六进制表示的包含LOB的表的OBJECT_ID号:    
   
SQL>   select   object_name,   object_type  
      2     from   user_objects  
      3     where   object_id   =   to_number( '9912 ',   'XXXX ');  
   
OBJECT_NAME                   OBJECT_TYPE  
-----------                   -----------  
T                                     TABLE  
   
所以利用这些项不仅可以看到打开的LOB,还可以确定它们来自哪些表。

------解决方案--------------------
不能直接用to_char(info)

而应该使用 
DBMS_LOB.SUBSTR (
lob_loc IN CLOB CHARACTER SET ANY_CS,
amount IN INTEGER := 32767,
offset IN INTEGER := 1)
RETURN VARCHAR2
这个oracle提供的包函数
------解决方案--------------------
select DBMS_LOB.SUBSTR(info,100,1) info............ from table1
------解决方案--------------------
select DBMS_LOB.substr(content,DBMS_LOB.getlength(content),1) from lmdata where rownum=1