如何一次性取出某个表的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