中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > PostgreSQL
POSTGRESQL的JDBC中的存储过程
作者:未知 时间:2005-09-13 18:57 出处:ChinaUnix.net 责编:chinaitpower
              摘要:POSTGRESQL的JDBC中的存储过程

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
我这么命苦啊?         

 夜猫子 回复于: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
用不着那么麻烦。我一直都是这么用。

[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]

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有