POSTGRESQL的JDBC中的存储过程
2009-03-17 18:22
405 查看
1. 从www.postgresql.org下载最新的postgresql-snapshot.tar.gz, ant from apache;
2. setting ANT_HOME
3. ../configure --with-java; make; make install
FUNCTION 和 JAVA 代码参考了jdbc.postgresql.org mailing list里面的内容.
CREATE TABLE users (id int, name varchar(32));
CREATE OR REPLACE FUNCTION sp_users_select () RETURNS refcursor
AS '
declare ref refcursor;
begin
open ref for select * from users;
return ref;
end;
' LANGUAGE plpgsql;
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); // return refcursor must within a transaction
CallableStatement proc = conn.prepareCall("{ ? = call sp_users_select () }");
proc.registerOutParameter(1, Types.OTHER);
proc.execute();
ResultSet result = (ResultSet) proc.getObject(1);
System.out.println(result);
while(result.next())
{
System.err.println("Name : " + result.getString(2));
}
conn.commit();
}
}
夜猫子 回复于:2003-07-17 01:02:05
java我是一窍不通的,不好意思。
joint 回复于:2003-07-17 09:44:32
我这么命苦啊? :cry: :cry: :cry: :cry: :cry:
夜猫子 回复于:2003-07-17 10:37:12
你命好,大家嚼烂了的东西,有什么意思,大家都不懂,你搞定了才有意思。
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
用不着那么麻烦。我一直都是这么用。
2. setting ANT_HOME
3. ../configure --with-java; make; make install
FUNCTION 和 JAVA 代码参考了jdbc.postgresql.org mailing list里面的内容.
CREATE TABLE users (id int, name varchar(32));
CREATE OR REPLACE FUNCTION sp_users_select () RETURNS refcursor
AS '
declare ref refcursor;
begin
open ref for select * from users;
return ref;
end;
' LANGUAGE plpgsql;
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); // return refcursor must within a transaction
CallableStatement proc = conn.prepareCall("{ ? = call sp_users_select () }");
proc.registerOutParameter(1, Types.OTHER);
proc.execute();
ResultSet result = (ResultSet) proc.getObject(1);
System.out.println(result);
while(result.next())
{
System.err.println("Name : " + result.getString(2));
}
conn.commit();
}
}
夜猫子 回复于:2003-07-17 01:02:05
java我是一窍不通的,不好意思。
joint 回复于:2003-07-17 09:44:32
我这么命苦啊? :cry: :cry: :cry: :cry: :cry:
夜猫子 回复于:2003-07-17 10:37:12
你命好,大家嚼烂了的东西,有什么意思,大家都不懂,你搞定了才有意思。
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
用不着那么麻烦。我一直都是这么用。
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|登录
相关文章推荐
- jdbc调用postgresql的存储过程
- JDBC和JPA调用储存过程 接收存储过程有返回值
- Mybatis调用PostgreSQL存储过程实现数组入参传递
- jdbc 包含存储过程的主要连接数据库方法
- 简单版的JDBC存储过程--输入通用方法
- JDBC执行存储过程的四种情况 (转)
- 【Java EE 学习 29 下】【JDBC编程中操作Oracle数据库】【调用存储过程的方法】
- JDBC连接执行MySQL存储过程报空指针或权限错误
- PostgreSQL9.3 存储过程与触发器入门
- 通过jdbc调用存储过程
- postgresql 存储过程使用
- Java-JDBC调用批处理、存储过程、事务
- JDBC调用返回结果集的存储过程
- JDBC存储过程的调用
- JDBC调用存储过程
- jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法
- PostgreSQL的存储过程简单入门
- iBatis 调用 PostgreSQL 存储过程返回结果集
- web 学习笔记15-JDBC大数据 批处理 存储过程 事务
- PostgreSQL 存储过程中回滚(ROLLBACK)和数组的使用