可能性がありjavaから。これを試して。
create or replace function get_cursor(p_type varchar2 default null/* other paramethers*/) return sys_refcursor
is
result_curosr sys_refcursor;
begin
open result_curosr for 'select '||p_type||' object_type,status from user_objects' /* where clausele */ ;
return result_curosr;
end;
これをjavaから使用します。
Connection con = ...
CallableStatement callableStatement = con.prepareCall("declare c sys_refcursor; begin ? := get_cursor(?); end ; ");
callableStatement.registerOutParameter(1, OracleTypes.CURSOR);
callableStatement.setString(2, "Distinct"); // for distinct
or
callableStatement.setNull(2, OracleTypes.VARCHAR); // for full results
callableStatement.executeUpdate();
ResultSet rs = (ResultSet) callableStatement.getObject(1);
while(rs.next()) {
System.err.println(rs.getString(1));
}
rs.close();
con.close();
その他の解決策。 もう1つのパラメータを追加し、クエリのすべての列を使用して簡単な重複排除を実行します。しかし、私には利点はありません。
select object_type,status from
(select object_type,status, row_number() over(partition by object_type,status order by 1) rn from user_objects /* your_where_clusue */
) where rn = case when 'DISTIINCT'/* <- paramete here :isDistinct */ = 'DISTIINCT' then 1 else rn end;
動的SQLはオプションかもしれません – SomeJavaGuy
はい、ですが、私は動的SQLを避けたいです – mariami
2番目は最初のものから派生するので、最初のものを一時テーブルに挿入して、それをオプションにすることができます。 –