Oracle10 sp execute the very very long sql!
2011-04-28 10:58
429 查看
1. Use the clob to concatenate the sql string.
2. Use DBMS_SQL to execute SQL.
PROCEDURE update_xx (
inputParam IN clob,
errArray out SQL_ERR_TYPE_ARRAY
)
v_data DBMS_SQL.Varchar2_Table;
sql_statemt clob;
indx NUMBER := 1;
error SQL_ERR_TYPE;
errorIndex int:=1;
i NUMBER := 0;
j NUMBER := 0;
clobLong NUMBER;
tempSql DBMS_SQL.varchar2a;
l_offset NUMBER :=1;
BEGIN
errArray := new SQL_ERR_TYPE_ARRAY();
sql_statemt := 'select ....' || inputParam;
clobLong := dbms_lob.getlength(sql_statemt);
begin
loop
exit when l_offset > clobLong;
j := j + 1;
tempSql(j) := substr( sql_statemt, l_offset, 30000 );
l_offset := l_offset + 30000;
end loop;
end;
-- define array
DBMS_SQL.DEFINE_ARRAY(v_cursor, 1, v_data, 500, indx);
v_execute := DBMS_SQL.EXECUTE(v_cursor);
loop
v_execute := DBMS_SQL.FETCH_ROWS(v_cursor);
-- put data to array
DBMS_SQL.COLUMN_VALUE(v_cursor, 1, v_data);
for dataIndex in 1 .. v_execute loop
i := i + 1;
dbms_output.put_line('fetch rows is ' || v_data(i));
-- put udpate sql
EXCEPTION
WHEN OTHERS THEN
error := new SQL_ERR_TYPE(v_asset_id(i), SQLCODE, SQLERRM);
errArray.extend();
errArray(errorIndex) := error;
errorIndex := errorIndex+1;
end loop;
EXIT WHEN v_execute < 500;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
END update_xx;
2. Use DBMS_SQL to execute SQL.
PROCEDURE update_xx (
inputParam IN clob,
errArray out SQL_ERR_TYPE_ARRAY
)
v_data DBMS_SQL.Varchar2_Table;
sql_statemt clob;
indx NUMBER := 1;
error SQL_ERR_TYPE;
errorIndex int:=1;
i NUMBER := 0;
j NUMBER := 0;
clobLong NUMBER;
tempSql DBMS_SQL.varchar2a;
l_offset NUMBER :=1;
BEGIN
errArray := new SQL_ERR_TYPE_ARRAY();
sql_statemt := 'select ....' || inputParam;
clobLong := dbms_lob.getlength(sql_statemt);
begin
loop
exit when l_offset > clobLong;
j := j + 1;
tempSql(j) := substr( sql_statemt, l_offset, 30000 );
l_offset := l_offset + 30000;
end loop;
end;
-- define array
DBMS_SQL.DEFINE_ARRAY(v_cursor, 1, v_data, 500, indx);
v_execute := DBMS_SQL.EXECUTE(v_cursor);
loop
v_execute := DBMS_SQL.FETCH_ROWS(v_cursor);
-- put data to array
DBMS_SQL.COLUMN_VALUE(v_cursor, 1, v_data);
for dataIndex in 1 .. v_execute loop
i := i + 1;
dbms_output.put_line('fetch rows is ' || v_data(i));
-- put udpate sql
EXCEPTION
WHEN OTHERS THEN
error := new SQL_ERR_TYPE(v_asset_id(i), SQLCODE, SQLERRM);
errArray.extend();
errArray(errorIndex) := error;
errorIndex := errorIndex+1;
end loop;
EXIT WHEN v_execute < 500;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(v_cursor);
END update_xx;
相关文章推荐
- Use sp_executesql to deal with the Image type Parameter in SP
- Windows sql语句正则匹配导出数据到本地 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
- 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed
- Oracle 学习之SQL(一) Retrieving Data Using the SQL SELECT statement
- SQL: See the TSQL underneath the sp_execute calls
- 全面复习之SQL(10)-oracle常用函数
- PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- sp_executesql 或者 EXECUTE 执行动态sql的权限问题
- 解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- sqlserver 动态sql执行execute和sp_executesql
- pl sql连接oracle报错12154-解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- System variables, logging and the Execute SQL Task...(zz)
- How to change the language to English for Oracle SQL Developer(如何将SQL developer改成英文界面)
- Problems in mapping parameters of type Int64 to the Execute SQL Task
- SQL Server-聚焦sp_executesql执行动态SQL查询性能真的比exec好?
- Oracle EBS-SQL (SYS-10):锁定表查询.sql
- 借助PL/SQL将服务器上的oracle10数据库转移到另一台服务器上的方法
- In Oracle 11g, how to change the order of the results of a sql without “order by”?(转)
- 解决X64操作系统PL/SQL连接报错问题 make sure you have the 32 bits oracle client installed
- execute sp_executesql 拼接sql 并执行