大字段肯定不能用varchar2了,只有用long或clob,但建议用clob。
这里有clob的操作语句,你可以参考一下
动态PL/SQL,对CLOB字段操作可传递表名table_name,表的唯一标志字段名field_id,clob字段名field_name,记录号v_id,开始处理字符的位置v_pos,传入的字符串变量v_clob修改CLOB的PL/SQL过程:updateclobcreate or replace procedure updateclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number,
v_clob in varchar2)
is
lobloc clob;
c_clob varchar2(32767);
amt binary_integer;
pos binary_integer;
query_str varchar2(1000);
begin
pos:=v_pos*32766+1;
amt := length(v_clob);
c_clob:=v_clob;
query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id for update ';
--initialize buffer with data to be inserted or updated
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
--from pos position, write 32766 varchar2 into lobloc
dbms_lob.write(lobloc, amt, pos, c_clob);
commit;
exception
when others then
rollback;
end;
/
用法说明:
在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),
然后调用以上的过程插入大于2048到32766个字符。
如果需要插入大于32767个字符,编一个循环即可解决问题。查询CLOB的PL/SQL函数:getclob
create or replace function getclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number) return varchar2
is
lobloc clob;
buffer varchar2(32767);
amount number := 2000;
offset number := 1;
query_str varchar2(1000);
begin
query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id ';
--initialize buffer with data to be found
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
offset:=offset+(v_pos-1)*2000;
--read 2000 varchar2 from the buffer
dbms_lob.read(lobloc,amount,offset,buffer);
return buffer;
exception
when no_data_found then
return buffer;
end;
/用法说明:用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;
可以从CLOB字段中取2000个字符到partstr中,
编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。
这里有clob的操作语句,你可以参考一下
动态PL/SQL,对CLOB字段操作可传递表名table_name,表的唯一标志字段名field_id,clob字段名field_name,记录号v_id,开始处理字符的位置v_pos,传入的字符串变量v_clob修改CLOB的PL/SQL过程:updateclobcreate or replace procedure updateclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number,
v_clob in varchar2)
is
lobloc clob;
c_clob varchar2(32767);
amt binary_integer;
pos binary_integer;
query_str varchar2(1000);
begin
pos:=v_pos*32766+1;
amt := length(v_clob);
c_clob:=v_clob;
query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id for update ';
--initialize buffer with data to be inserted or updated
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
--from pos position, write 32766 varchar2 into lobloc
dbms_lob.write(lobloc, amt, pos, c_clob);
commit;
exception
when others then
rollback;
end;
/
用法说明:
在插入或修改以前,先把其它字段插入或修改,CLOB字段设置为空empty_clob(),
然后调用以上的过程插入大于2048到32766个字符。
如果需要插入大于32767个字符,编一个循环即可解决问题。查询CLOB的PL/SQL函数:getclob
create or replace function getclob(
table_name in varchar2,
field_id in varchar2,
field_name in varchar2,
v_id in number,
v_pos in number) return varchar2
is
lobloc clob;
buffer varchar2(32767);
amount number := 2000;
offset number := 1;
query_str varchar2(1000);
begin
query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id ';
--initialize buffer with data to be found
EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
offset:=offset+(v_pos-1)*2000;
--read 2000 varchar2 from the buffer
dbms_lob.read(lobloc,amount,offset,buffer);
return buffer;
exception
when no_data_found then
return buffer;
end;
/用法说明:用select getclob(table_name,field_id,field_name,v_id,v_pos) as partstr from dual;
可以从CLOB字段中取2000个字符到partstr中,
编一个循环可以把partstr组合成dbms_lob.getlength(field_name)长度的目标字符串。
解决方案 »
- 关于函数返回clob的问题
- 关于oracle 10g 透明网关乱码的问题
- 在两台数据库服务之间共享数据,应该如何实现?(急!!!!)
- 请问pro*c预编译器在oracle的哪个产品组件里?在那里可以下载?谢谢
- 用console连接数据库时提示:没有监听器。添加本地网络服务名,输入本机IP,连接不成功,改成127.0.0.1才可以???
- 如何导出角色的脚本,急!!!!!!!!
- 如何取得局域网内所有Oracle的数据库服务器?
- 如何"turn on the Tracing"?
- 请问Oracle 8.05 跟 8.17的sqlldr有什么不同的地方需要注意吗?急
- 关于锁表问题
- 817在red hat 7.3下的安装问题
- oracle初学者的几个小问题,关于数据类型的。还请高手不吝赐教
其实,其语句在SQL WorkSheet中执行肯定不好,太长了。
一般都是应用程序调用
第一。我的Oracle不能创建CLOB类型的字段,总出现默认字符集不够宽
第二。这个存储过程我编译过了,SQL WorkSheet中编译不过去
请帮帮我
Oracle不能创建CLOB类型的字段,总出现默认字符集不够宽
请把你的init.ora中compatible参数调整到8.1.0
应当能编译过出的,什么错误?
SQLWKS> show errors
PROCEDURE UPDATECLOB出现错误:
LINE/COL ERROR
--------------------------------------------------------------------------------
20/12 PLS-00103: 出现符号"IMMEDIATE"在需要下列之一时:
:=.(@%;
20/44 PLS-00103: 出现符号"USING"在需要下列之一时:
.(,%from
符号"from"被替换
建议参考dbms_sql包的用法
调用函数很简单,和查询一样
select funcname(para1,para2) from dual;
就可以在asp中调用了。你把结果当成一个记录集来处理(虽然只有一行)
ERROR 位于第 1 行:
ORA-21560: 参数3为空、无效或超出范围
ORA-06512: 在"SYS.DBMS_LOB", line 648
ORA-06512: 在"JCXXDB.GETCLOB", line 19
ORA-06512: 在line 1
晴帮忙