oracleclob存储过程
① oracle 存储过程里用 execute immedate 动态sql,更新一个表的clob字段报字符长度
sql里面varchar2最多4000个字节,sql语句最多32K长度,估计是你的a_clob太长,放到sql里面超过这个限制了,具体是哪个原因还得你自己测试。
可以使用绑定变量的方式来做。
V_SQL := 'UPDATE B '|| ' SET B_CLOB = ''' || AA.A_CLOB ||''' WHERE B_KEY = '''|| AA.A_KEY || '''';
EXECUTE IMMEDIATE V_SQL;
改成:
V_SQL := 'UPDATE B SET B_CLOB =:1 WHERE B_KEY =:2 ';
EXECUTE IMMEDIATE V_SQL using AA.A_CLOB,AA.A_KEY;
② oracle存储过程clob类型参数为null问题
-- Created on 2014-11-05 by EMO
DECLARE
-- Local variables here
PROCEDURE clob_test(p_clob CLOB) IS
BEGIN
dbms_output.put_line('CLOB' || p_clob);
END;
BEGIN
-- Test statements here
clob_test(:l_clob);
END;
我把类型从CLOB改成了 String , 测试完全没问题,用CLOB是不行的
③ 一个关于oracle存储过程的clob问题
v_parse:= xmlparser.newParser();
xmlparser.parserClob(v_parse,clob数据);
xmldom.domdocument
xmldom.domnodelist
④ oracle 怎样通过存储过程insert clob字段
您好,很高兴为您解答。
createtabledemo
(idintprimarykey,
theBlobblob
)
/
createorreplacedirectorymy_filesas'/export/home/tkyte/public_html';
declare
l_blobblob;
l_bfilebfile;
begin
insertintodemovalues(1,empty_blob())
returningtheBlobintol_blob;
l_bfile:=bfilename('MY_FILES','aria.gif');
dbms_lob.fileopen(l_bfile);
dbms_lob.loadfromfile(l_blob,l_bfile,
dbms_lob.getlength(l_bfile));
dbms_lob.fileclose(l_bfile);
end;
/
如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】
希望我的回答对您有所帮助,望采纳!
~O(∩_∩)O~
⑤ Oracle数据库中把SQL存在CLOB字段中 ,现需对其定时执行,通过存储过程对其执行报错
CLOB这个类型就是使用CHAR来保存数据的,把nvarchar类型数据插入到oracle对应的CLOB类型中只要加个to_char()转换下就可以了
⑥ oracle如何操作clob数据类型
在做数据库开发的时候,有时候会遇到需要读取Oracle数据库中的clob类型的数据的情况。本着代码复用的目的,写了下面的存储过程:读取数据库中clob字段的数据。
CREATE OR REPLACE PROCEDURE prc_read_clob(
table_name IN VARCHAR2,
clob_column_name IN VARCHAR2,
primary_Key_Column_names IN VARCHAR2,
primary_key_values IN VARCHAR2,
offset_i IN NUMBER,
read_length_i IN NUMBER,
RES OUT VARCHAR2,
total_length OUT NUMBER
) AS
/**
Autor:Hanks_gao.
Create Date:2008/12/10
Description:This procere is to read clob value by conditions
--------------------------------------------------------------
-----------------Parameters descritption----------------------
table_name : The table that contains clob/blob columns(表名)
clob_column_name : Clob/blob column name of table_name(类型为clob的字段名)
primary_key_column_names : The columns seperated by '}' that can fix only one row data (that is primary key) (主键名,以'}'分隔的字符串)
primary_key_values : The primary keyes values that seperated by '}'(主键键值,以'}'分隔的字符串)
offset_i : The offset of reading clob data(要读取的位移量)
read_length_i : The length of reading clob data per times(要读取的长度)
res : Return value that can be referenced by application(读取的结果)
total_length : The total length of readed clob data(数据库查询到的clob数据的总长度)
-----------------End Parameters descritption------------------
*/
tmpPrimaryKeys VARCHAR2(2000); --To save primary_Key_Column_names temporarily(暂存主键,主键是以'}'分隔的字符串)
tmpPrimaryKeyValues VARCHAR2(2000); --To save primary_key_values temporarily(暂存主键键值,以'}'分隔的字符串)
i NUMBER; --循环控制变量
tmpReadLength NUMBER; --暂存要读取的长度
sqlStr VARCHAR2(6000); --Query string(查询字符串)
sqlCon VARCHAR2(5000); --Query condition(查询条件)
TYPE tmparray IS TABLE OF VARCHAR2(5000) INDEX BY BINARY_INTEGER;
arrayPrimaryKeys tmparray; --To save the analyse result of primary_Key_Column_names (暂存分析后得到的主键名)
arrayPrimaryKeyValues tmparray; --To save the analyse result of primary_key_values(暂存分析后得到的主键键值)
BEGIN
total_length := 0;
RES := '';
DECLARE
clobvar CLOB := EMPTY_CLOB;
BEGIN
tmpPrimaryKeys:=primary_Key_Column_names;
tmpPrimaryKeyValues:=primary_key_values;
i:=0;
WHILE INSTR(tmpPrimaryKeys,'}')>0 LOOP --Analyse the column names of primary key(将主键分开,相当于arrayPrimaryKeys =tmpPrimaryKeys.split("}") )
arrayPrimaryKeys(i):=subSTR(tmpPrimaryKeys,1,(INSTR(tmpPrimaryKeys,'}')-1));
tmpPrimaryKeys:=subSTR(tmpPrimaryKeys,(INSTR(tmpPrimaryKeys,'}')+1));
i:=i+1;
END LOOP;
i:=0;
WHILE INSTR(tmpPrimaryKeyValues,'}')>0 LOOP --Analyse the values of primary key
arrayPrimaryKeyValues(i):=subSTR(tmpPrimaryKeyValues,1,(INSTR(tmpPrimaryKeyValues,'}')-1));
tmpPrimaryKeyValues:=subSTR(tmpPrimaryKeyValues,(INSTR(tmpPrimaryKeyValues,'}')+1));
i:=i+1;
END LOOP;
IF arrayPrimaryKeys.COUNT()<>arrayPrimaryKeyValues.COUNT() THEN --判断键与键值是否能匹配起来
res:='KEY-VALUE NOT MATCH';
RETURN;
END IF;
i := 0;
sqlCon := '';
WHILE i < arrayPrimaryKeys.COUNT() LOOP
sqlCon := sqlCon || ' AND ' || arrayPrimaryKeys(i) || '='''
|| replace(arrayPrimaryKeyValues(i),'''','''''') || '''';
i := i + 1;
END LOOP;
sqlStr := 'SELECT ' || clob_column_name || ' FROM ' || table_name
|| ' WHERE 1=1 ' || sqlCon || ' AND ROWNUM = 1' ; --组查询字符串
dbms_lob.createtemporary(clobvar, TRUE);
dbms_lob.OPEN(clobvar, dbms_lob.lob_readwrite);
EXECUTE IMMEDIATE TRIM(sqlStr) INTO clobvar; --执行查询
IF offset_i <= 1 THEN
total_length:=dbms_lob.getlength(clobvar);
END IF;
IF read_length_i <=0 THEN
tmpReadLength := 4000;
ELSE
tmpReadLength := read_length_i;
END IF;
dbms_lob.READ(clobvar,tmpReadLength,offset_i,res); --读取数据
IF dbms_lob.ISOPEN(clobvar)=1 THEN
dbms_lob.CLOSE(clobvar);
END IF;
END;
EXCEPTION
WHEN OTHERS THEN
res:='';
total_length:=0;
END;
⑦ oracle 存储过程 求助
详见文本中“--注:”后的注释
create or replace procere test_cjsql_z( /*in_sqlnr in clob,*/out_code in out varchar2,
out_mess in out varchar2) Authid Current_User IS
--注:创建存储过程test_cjsql_z,输入输出型参数out_code、out_mess
PRAGMA AUTONOMOUS_TRANSACTION; --注:自助事务处理
in_sqlnr clob;--注:声明clob类型变量
V_LENGTH NUMBER;--注:number是数值类型变量
V_NUMBER1 NUMBER;
V_NUMBER2 NUMBER;
V_BSF NUMBER; --标识附,标识SQL语句中最后CHR(10)的位置。
V_STEP NUMBER;
buffer VARCHAR2(4000);--注:varchar2(xx)是字符串类型变量,xx是长度
V_TEMPSQL VARCHAR2(4000);
V_LINESQL VARCHAR2(4000);
V_SQLERR VARCHAR2(255);
jb_err exception;--注:声明例外对象
amount INT;
--v_sql VARCHAR2(4000);
BEGIN
select sqlnr into in_sqlnr from t_sql where sql_id = '100475'; --取clob 字段
V_LENGTH := to_number(ceil(dbms_lob.getlength(in_sqlnr) / 2000)); --取lob长度
for i in 1 .. V_LENGTH loop
--循环次数
amount := 2000;--注:以2000为单位
dbms_lob.read(in_sqlnr, amount, (i - 1) * 2000 + 1, buffer); --提取lob
buffer := replace(buffer, chr(13), ''); --替换 回车
buffer := V_TEMPSQL || buffer;--注:拼接字符串
V_BSF := INSTR(buffer, CHR(10), -1, 1); --最后 换行 的位置
V_TEMPSQL := SUBSTR(buffer, V_BSF, length(buffer) - V_BSF + 1);--注:从buffer中截取字符串
buffer := SUBSTR(buffer, 1, V_BSF);
V_STEP := 1;
loop
V_NUMBER1 := INSTR(buffer, CHR(10), 1, V_STEP);
V_NUMBER2 := INSTR(buffer, CHR(10), 1, V_STEP + 1);
V_LINESQL := RTRIM(REPLACE(SUBSTR(buffer,
V_NUMBER1,
V_NUMBER2 - V_NUMBER1 + 1),
CHR(10),
''),
';');
EXIT WHEN V_LINESQL IS NULL; --V_LINESQL 为 null 跳出循环
BEGIN
-- v_sql := 'insert into hx_sjmx.test_zh values (V_LINESQL)';
-- EXECUTE IMMEDIATE v_sql;
EXECUTE IMMEDIATE V_LINESQL; --执行 V_LINESQL
EXCEPTION --注:FOR循环中的例外处理部分
WHEN OTHERS THEN
V_SQLERR := SUBSTR(SQLERRM, 1, 255); --例外
out_code := '2';--注:输出返回代码
out_mess := substrb(V_SQLERR || '-' || V_LINESQL, 1, 2000);--注:输出返回文本
raise jb_err;--注:抛出例外
END;
V_STEP := V_STEP + 1;
end loop;
end loop;
out_code := '1';--注:输出返回代码
out_mess := '执行成功!';--注:输出返回文本
commit;
exception--注:例外处理
when jb_err then--注:当出现自定义例外时
rollback;--注:回滚
when others then--注:其它情况
V_SQLERR := SUBSTR(SQLERRM, 1, 255);
out_code := '3';--注:输出返回代码
out_mess := V_SQLERR;--注:输出返回文本
rollback;--注:回滚
END test_cjsql_z;