往oracle函CLOB、LONG字段類型的數據表插入值超過4000字節時,在執行INSERT INTO提示:ORA-01704:文字字符串過長錯誤,這種情況下,如果想用SQL實現的話,可以通過ORACLE存儲過程實現。
--ASQL:帶參數的INSERT INTO 語句
--ALongVar1 : 參數值,大於4000字節
CREATE OR REPLACE PROCEDURE EXEC_SQL1(ASQL varchar2, ALongVar1 clob)
AS
BEGIN
EXECUTE IMMEDIATE ASQL USING ALongValue;
END EXEC_SQL1;
--處理方法二:用Dbms_sql接口實現
--ASQL:帶參數的INSERT INTO 語句
--ALongVar1 : 參數值,大於4000字節
CREATE OR REPLACE PROCEDURE EXEC_SQL(ASQL clob, ALongValue clob)
AS
The_c1 Integer;
The_result Integer;--dml_sql_result
BEGIN
The_C1 :=Dbms_sql.open_cursor;
Dbms_sql.parse(the_C1, ASQL, DBMS_SQL.NATIVE);
DBMS_SQL.BIND_VARIABLE
(The_c1, ':LongValue', ALongValue);
The_result:=Dbms_sql.execute(The_c1);
Dbms_sql.close_cursor(The_C1);
END EXEC_SQL;
DELPHI調用例子:
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ;
AdoQuery1.SQL.Clear ;
AdoQuery1.SQL.Add('{call exec_sql(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('asql',ftOraClob,pdinput, 30,'') ;
AdoQuery1.Parameters.CreateParameter('alongvalue',ftOraClob,pdinput, 30,'') ;
--語句
AdoQuery1.Parameters.ParamByName('asql').Value :='INSERT INTO TAB(ID, CLOBFLD) VALUES(1, :CLOBVALUE)';
--值
AdoQuery1.Parameters.ParamByName('CLOBVALUE').Value :='CLOBVALUE....';
AdoQuery1.ExecSQL ;