代码如下: create table yejf_count_user( u_status varchar2(20), u_count integer ) -- 动态SQL包: dbms_sql 包: create or replace procedure yejf_count(e p_status varchar2 ) IS c_select integer; v_result integer; v_sql varchar2(500); v_status yejf_user.u_status%type; v_count integer; v_errmsg varchar2(400); begin c_select := dbms_sql.open_cursor; v_sql := ' select u_status,count(*) '; v_sql := v_sql||'from yejf_user'; v_sql := v_sql||' where u_status = :status'; v_sql := v_sql||' group by u_status'; -- 解析 SQL; dbms_sql.parse(c_select,v_sql,dbms_sql.native); -- 绑定参数; dbms_sql.bind_variable(c_select,'status',p_status); 现在我创建好了这个存储过程,想从JDBC里调用他,用CallableStatement 那调用的SQL字符串怎么写? ,另外解析和绑定参数是否在oracle中必须写上?
import oracle.jdbc.*;import oracle.sql.*;import java.sql.*;public class ReturnIndexTable{ Connection ociconn=null;OracleCallableStatement stmt =null;public String[] getTable(String in_param){ String[] reAry=null;try{ OracleDriver S_Driver=null;if(S_Driver==null)S_Driver=new oracle.jdbc.OracleDriver();DriverManager.registerDriver(S_Driver);String url="jdbc:oracle:oci8:@test";String user="user";String password=" password";ociconn= DriverManager.getConnection(url,user,password);stmt =(OracleCallableStatement)ociconn.prepareCall("begin yejf_count(?,?); end;");// 返回的索引表最大长度(可以大于索引表实际长度)int maxLen =31;// 索引表元素类型int elemSqlType = OracleTypes.VARCHAR;//索引表元素长度(CHAR, VARCHAR or RAW),其它元素类型可忽略该项值,但该参数仍须定义int elemMaxLen=50;stmt.setString(1,in_param);// 注册返回参数stmt.registerIndexTableOutParameter(2,maxLen,elemSqlType,elemMaxLen);stmt.execute();// 返回数组类型reAry=(String[])stmt.getPlsqlIndexTable(2);}catch (Exception e){e.printStackTrace();}finally{return reAry;}}//关闭连接.............}