免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7318 | 回复: 7

POSTGRESQL的JDBC中的存储过程 [复制链接]

论坛徽章:
0
发表于 2003-07-16 23:29 |显示全部楼层
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();
        }
}

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2003-07-17 01:02 |显示全部楼层

POSTGRESQL的JDBC中的存储过程

java我是一窍不通的,不好意思。

论坛徽章:
0
发表于 2003-07-17 09:44 |显示全部楼层

POSTGRESQL的JDBC中的存储过程

我这么命苦啊?         

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2003-07-17 10:37 |显示全部楼层

POSTGRESQL的JDBC中的存储过程

你命好,大家嚼烂了的东西,有什么意思,大家都不懂,你搞定了才有意思。

论坛徽章:
0
发表于 2003-07-19 12:44 |显示全部楼层

POSTGRESQL的JDBC中的存储过程

猫子,我解决了,哈哈,HAPPY,最新的驱动解决了CallableStatement,先做了个return refcursor测试,其他的可以从JDBC代码的test里面参考,稍后做UPDATE, DELETE,INSERT测试

论坛徽章:
0
发表于 2003-07-19 14:01 |显示全部楼层

POSTGRESQL的JDBC中的存储过程

就写这么多了,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();
        }
}

论坛徽章:
0
发表于 2003-07-29 22:04 |显示全部楼层

POSTGRESQL的JDBC中的存储过程

已经有这么多人看了啊,呵呵,希望对有所帮助

论坛徽章:
0
发表于 2003-10-07 15:14 |显示全部楼层

POSTGRESQL的JDBC中的存储过程

用不着那么麻烦。我一直都是这么用。


  1. CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
  2. BEGIN
  3.         OPEN $1 FOR SELECT * FROM system_log;
  4.         RETURN $1;
  5. END;
  6. ' LANGUAGE 'plpgsql';

  7. BEGIN;
  8. SELECT reffunc('funccursor');
  9. FETCH ALL IN funccursor;
  10. COMMIT;


  11. public void Cursors(){
  12.         String sql                         = "SELECT reffunc('funccursor')";
  13.         String sql2                        = "FETCH ALL IN funccursor";

  14.         DBConnect odb = null;
  15.         try{
  16.                 odb = new DBConnect(oDatabase);
  17.                 odb.Begin();
  18.                 odb.prepareStatement(sql);
  19.                 rs = odb.executeQuery();
  20.                 odb.prepareStatement(sql2);
  21.                
  22.                 //odb.setString(1,user);
  23.                 rs = odb.executeQuery();
  24.                 if(rs!=null) {
  25.                         while(rs.next()){
  26.                                 System.out.print(rs.getString(1)+"|");
  27.                                 System.out.print(rs.getString(2)+"|");
  28.                                 System.out.print(rs.getString(3)+"|");
  29.                                 System.out.println(rs.getString(4));
  30.                         }        
  31.                 }
  32.                 odb.Commit();
  33.         }
  34.         catch(Exception e){
  35.                 e.printStackTrace();
  36.         }
  37.         finally{
  38.                 try{
  39.                         odb.close();
  40.                 }catch(Exception e){
  41.                         e.printStackTrace();
  42.                 }
  43.         }
  44. }
  45. 53|1|127.0.0.1|Create Database
  46. 54|2|192.168.0.5|上线
  47. 55|2|192.168.0.2|登录
  48. 56|2|192.168.1.31|登录
  49. 57|2|127.0.0.1|登录
  50. 58|1|127.0.0.1|登录
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP