Java 调用Oracle存储过程,动态执行参数化Sql语句。
说明:Java 调用存储过程,传递一个任意参数化的Sql语句,和相应的参数列表,执行返回结果集。
思考:存储过程返回结果集一般用游标(cursor),执行语句一般未:open cur for Sql using parameter1,parameter1,....,parameterN;using后跟参数列表。但是这样有个局限,using 后的参数列表个数是确定的,只能手动填写,不能用循环。此时需要用过程中的另外一个包,dbms_sql。
具体实现步骤如下:
需要Jar 包:ojdbc6.jar、orai18n.jar 、druid-1.0.9.jar
1. 创建数组类型。
create or replace type varchar2_array as varray(50000) of varchar2(5000);
2. 创建存储过程
create or replace procedure list_sql(p_query in varchar2,sqlv_para in varchar2_array,rs out varchar2_array) is
l_columnValue varchar2(4000); --列值
l_status integer; --状态
l_colCnt number default 0; --列的个数
l_cnt number default 0;--列索引
l_line long; --行值
l_descTbl dbms_sql.desc_tab; --table对象
l_theCursor integer default dbms_sql.open_cursor; --游标编号
rec_tab dbms_sql.desc_tab;
begin
dbms_sql.parse(l_theCursor, p_query, dbms_sql.native); --解析
for i in 1..sqlv_para.count loop --绑定参数
dbms_sql.bind_variable(l_theCursor, ':'||i, sqlv_para(i));
end loop;
dbms_sql.describe_columns(l_theCursor, l_colCnt, l_descTbl);
rs:=varchar2_array(); --初始化数组
for i in 1 .. l_colCnt loop
dbms_sql.define_column(l_theCursor, i, l_columnValue, 4000); --定义列
end loop;
l_status := dbms_sql.execute(l_theCursor);
dbms_sql.describe_columns(l_theCursor, l_colCnt, rec_tab);
while (dbms_sql.fetch_rows(l_theCursor) > 0) loop --遍历光标,取得数据
rs.extend;
l_cnt := l_cnt + 1; --第N行
l_line := '{'; --拼接数据
for i in 1 .. l_colCnt loop
dbms_sql.column_value(l_theCursor, i, l_columnValue);
l_line:=l_line||rec_tab(i).col_name||':'||l_columnValue;
if i<>l_colCnt then
l_line:=l_line||',';
end if;
end loop;
l_line:=l_line||'}';
rs(l_cnt):=l_line; --将数据放入数组中
-- dbms_output.put_line(l_line);
end loop;
dbms_sql.close_cursor(l_theCursor);
exception
when others then
dbms_sql.close_cursor(l_theCursor);
raise;
end list_sql;
public static void main(String[] args) {
String sql = "select count(EC001.Area) total from dy2 d join EC001 EC001 on d.代码2=EC001.area " +
"where 1=1 and (EC001.currentprovertystatus='1' or EC001.currentprovertystatus is null) and 1=1 ";
getSqlObject(sql);
}
public static List
ResultSet rs = null; CallableStatement st = null; Connection con = null; HashMap map = null; List> list = new ArrayList>(); try {
con = Connections.getConnection();
List sql_o_l = SqlUtil.getSqlObjectByproc(sql_v);
String sql = sql_o_l.get(0).toString();
Map sql_v_m = (Map) sql_o_l.get(1);
String[] parameValue_array = new String[sql_v_m.size()];
int sqlvm_index = 0;
for (Object o : sql_v_m.keySet()) {
parameValue_array[sqlvm_index] = sql_v_m.get(o);
sqlvm_index++;
}
ArrayDescriptor des = ArrayDescriptor.createDescriptor("varchar2_array".toUpperCase(), con.getMetaData().getConnection());
ARRAY array_to_pass = new ARRAY(des, con.getMetaData().getConnection(), parameValue_array);