|
joint 回复于:2003-07-19 12:44:20 猫子,我解决了,哈哈,HAPPY,最新的驱动解决了CallableStatement,先做了个return refcursor测试,其他的可以从JDBC代码的test里面参考,稍后做UPDATE, DELETE,INSERT测试
-------------------------------------------------------------------------------- joint 回复于:2003-07-19 14:01:24 就写这么多了,JAVA程序最后还有个invalid message length的问题,没找到是在哪里,想到了再说吧
-- -- PostgreSQL database dump --
\connect - postgres
SET search_path = public, pg_catalog;
-- -- TOC entry 7 (OID 17142) -- Name: plpgsql_call_handler (); Type: FUNC PROCEDURAL LANGUAGE; Schema: public; Owner: postgres --
CREATE FUNCTION plpgsql_call_handler () RETURNS language_handler AS '$libdir/plpgsql', 'plpgsql_call_handler' LANGUAGE c;
-- -- TOC entry 6 (OID 17143) -- Name: plpgsql; Type: PROCEDURAL LANGUAGE; Schema: public; Owner: --
CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler;
-- -- TOC entry 2 (OID 2200) -- Name: public; Type: ACL; Schema: -; Owner: postgres --
REVOKE ALL ON SCHEMA public FROM PUBLIC; GRANT ALL ON SCHEMA public TO PUBLIC;
-- -- TOC entry 3 (OID 17140) -- Name: users; Type: TABLE; Schema: public; Owner: postgres --
CREATE TABLE users ( id integer NOT NULL, name character varying(32) );
-- -- TOC entry 4 (OID 17140) -- Name: users; Type: ACL; Schema: public; Owner: postgres --
REVOKE ALL ON TABLE users FROM PUBLIC; GRANT INSERT,SELECT,UPDATE,DELETE ON TABLE users TO nop;
-- -- TOC entry 8 (OID 17144) -- Name: sp_users_select (); Type: FUNCTION; Schema: public; Owner: postgres --
CREATE FUNCTION sp_users_select () RETURNS refcursor AS ' declare ref refcursor; begin open ref for select * from users; return ref; end; ' LANGUAGE plpgsql;
-- -- TOC entry 9 (OID 17149) -- Name: sp_users_insert (integer, character varying); Type: FUNCTION; Schema: public; Owner: postgres --
CREATE FUNCTION sp_users_insert (integer, character varying) RETURNS integer AS ' declare v_id alias for $1; v_name alias for $2; v_return int; begin insert into users values (v_id, v_name); get diagnostics v_return = ROW_COUNT; return v_return; end;' LANGUAGE plpgsql;
-- -- TOC entry 10 (OID 17156) -- Name: sp_users_delete (integer); Type: FUNCTION; Schema: public; Owner: postgres --
CREATE FUNCTION sp_users_delete (integer) RETURNS integer AS ' declare v_id alias for $1; v_return int; begin delete from users where id = v_id; get diagnostics v_return = ROW_COUNT; return v_return; end;' LANGUAGE plpgsql;
-- -- TOC entry 5 (OID 17147) -- Name: users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres --
ALTER TABLE ONLY users ADD CONSTRAINT users_pkey PRIMARY KEY (id);
//////////////////////////////////// import java.lang.*; import java.sql.*;
public class pc { public static void main(String[] args) throws Exception { String driver = "org.postgresql.Driver"; String url = "jdbc:postgresql://localhost:5432/nop"; String user = "nop"; String passwd = "nop";
Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, passwd);
// conn.setAutoCommit(false);
// Insert CallableStatement callInsert = conn.prepareCall("{ ? = call sp_users_insert(?, ?) }"); callInsert.registerOutParameter(1, Types.INTEGER); callInsert.setInt(2, 6); callInsert.setString(3, "ARRR"); callInsert.execute();
// Select conn.setAutoCommit(false); CallableStatement callSelect = conn.prepareCall("{ ? = call sp_users_select () }"); callSelect.registerOutParameter(1, Types.OTHER); callSelect.execute();
ResultSet rs = (ResultSet) callSelect.getObject(1); System.out.println(rs);
while(rs.next()) { System.err.println("Id : " + rs.getInt(1) + " Name : " + rs.getString(2)); }
conn.commit();
// Delete conn.setAutoCommit(false); CallableStatement callDelete = conn.prepareCall("{ ? = call sp_users_delete (?) }"); callDelete.registerOutParameter(1, Types.INTEGER); callDelete.setInt(2, 6); callDelete.execute(); conn.commit();
if(callInsert != null) callInsert.close(); if(callSelect != null) callSelect.close(); if(callDelete != null) callDelete.close(); if(rs != null) rs.close(); if(conn != null) conn.close(); } }
-------------------------------------------------------------------------------- joint 回复于:2003-07-29 22:04:10 已经有这么多人看了啊,呵呵,希望对有所帮助
-------------------------------------------------------------------------------- netkiller 回复于:2003-10-07 15:14:19 用不着那么麻烦。我一直都是这么用。
[code:1:f649d17f0d] CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS ' BEGIN OPEN $1 FOR SELECT * FROM system_log; RETURN $1; END; ' LANGUAGE 'plpgsql';
BEGIN; SELECT reffunc('funccursor'); FETCH ALL IN funccursor; COMMIT;
public void Cursors(){ String sql = "SELECT reffunc('funccursor')"; String sql2 = "FETCH ALL IN funccursor";
DBConnect odb = null; try{ odb = new DBConnect(oDatabase); odb.Begin(); odb.prepareStatement(sql); rs = odb.executeQuery(); odb.prepareStatement(sql2);
//odb.setString(1,user); rs = odb.executeQuery(); if(rs!=null) { while(rs.next()){ System.out.print(rs.getString(1)+"|"); System.out.print(rs.getString(2)+"|"); System.out.print(rs.getString(3)+"|"); System.out.println(rs.getString(4)); } } odb.Commit(); } catch(Exception e){ e.printStackTrace(); } finally{ try{ odb.close(); }catch(Exception e){ e.printStackTrace(); } } } 53|1|127.0.0.1|Create Database 54|2|192.168.0.5|上线 55|2|192.168.0.2|登录 56|2|192.168.1.31|登录 57|2|127.0.0.1|登录 58|1|127.0.0.1|登录[/code:1:f649d17f0d]
|