ORACLE-JDBC-02 入门

使用JDBC,访问数据库,无非是连接数据库,然后执行增删改查以及执行存储过程。

1.连接数据库

连接数据库有oci和thin两种方式

区别如下:

在为您的应用程序或小程序选择 JDBC 驱动程序时,请考虑以下事项:

  • 通常,除非您需要 OCI 特定的功能,例如支持非 TCP/IP 网络,否则请使用 JDBC Thin 驱动程序。

  • 如果您想要最大的可移植性和性能,请使用 JDBC Thin 驱动程序。您可以使用 JDBC 瘦驱动程序从应用程序或小程序连接到 Oracle 数据库。

  • 如果要在安全套接字层 (SSL) 上使用轻量级目录访问协议 (LDAP),请使用 JDBC 瘦驱动程序。

  • 如果您正在为 Oracle 客户端环境编写客户端应用程序并且需要 OCI 驱动程序特定的功能,例如对非 TCP/IP 网络的支持,那么请使用 JDBC OCI 驱动程序。

  • 如果您正在编写小程序,那么您必须使用 JDBC Thin 驱动程序。

  • 对于在数据库服务器中运行并需要访问远程数据库或同一数据库实例中的另一个会话的代码,请使用 JDBC 服务器端瘦驱动程序。

  • 如果您的代码在数据库服务器内部运行并且需要在会话中本地访问数据,则使用 JDBC 服务器端内部驱动程序来访问该服务器。

 我们采用JDBC Thin驱动进行连接

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;
import java.sql.Connection;
import java.sql.SQLException;

public class JDBC01 {
    public static void main(String args[])  throws SQLException {
        OracleDataSource ods = new OracleDataSource();
        String URL = "jdbc:oracle:thin:apps/apps@xxx:1521:ORCL";
        ods.setURL(URL);
        Connection conn = ods.getConnection();

    }
}

2.查找数据库表字段

package org.example;


import java.sql.*;
import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

public class J01
{
    public static void main () throws SQLException
    {
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@myhost:1521:ORCL");
        //建立连接
        Connection conn = ods.getConnection();
        //创建语句
        Statement stmt = conn.createStatement();
        //运行查询,返回结果集对象
        ResultSet rset = stmt.executeQuery ("SELECT object_name  FROM dba_objects where rownum=1");
       //处理结果集对象
        while (rset.next())
            System.out.println (rset.getString( 1));
        //关闭连接
        rset.close();
        //关闭结果集对象
        stmt.close();
    }
}

使用绑定变量

package org.example;

import oracle.jdbc.pool.OracleDataSource;

import java.sql.*;

public class TestSqlPlanLoopBind {


    public static void main (String[] args ) throws SQLException{
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@myhost:1521:ORCL");
        //建立连接
        Connection conn = ods.getConnection();
        //创建语句
        String sql = "SELECT /*test*/ a FROM apps.cux_number_test WHERE a =?";
        ResultSet rset;
        PreparedStatement stmt = conn.prepareStatement(sql);
        for (int i = 10000000; i <= 10000001; i++) {
            stmt.setInt(1, i);
            rset = stmt.executeQuery();
            while (rset.next()) {
                System.out.println(rset.getString(1));

            }

        }
        stmt.close();
    }


}

3.DDL创建表

package org.example;

import java.sql.*;

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

public class J02 {
    public static void main() throws SQLException {
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@myhost:1521:ORCL");
        //建立连接
        Connection conn = ods.getConnection();
        //创建语句
        Statement stmt = conn.createStatement();
        String query;
        try {
            query = "create table EMP " +
                    "(EMPNO number, " +
                    "ENAME varchar2(50))";
            stmt.executeUpdate(query);

        } finally {

            stmt.close();
        }
    }
}

4.DML写入数据

package org.example;

import java.sql.*;

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

public class J03 {
    public static void main() throws SQLException {
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@myhost:1521:ORCL");
        //建立连接
        Connection conn = ods.getConnection();
        //禁止默认提交
        conn.setAutoCommit(false);
        //创建语句
        PreparedStatement pstmt=null;
        try {

             pstmt = conn.prepareStatement("insert into EMP (EMPNO, ENAME) values (?, ?)");
            pstmt.setInt(1, 1500);
            pstmt.setString(2, "LESLIE");
            pstmt.execute();
        } finally {
            if (pstmt != null) {
                pstmt.close();
            }
        }

        //显示提交
        conn.commit();
    }
}

5.调用存储过程

在3中我们创建了表emp。4中往emp表写入了一条数据。

我们编写存储过程,获取ename

CREATE OR REPLACE PACKAGE cux_jdbc_test IS
  FUNCTION get_ename(p_empno IN NUMBER) RETURN VARCHAR2;
  PROCEDURE get_ename(p_empno IN NUMBER
                     ,p_ename IN OUT NOCOPY VARCHAR2);
END cux_jdbc_test;
CREATE OR REPLACE PACKAGE BODY cux_jdbc_test IS

  FUNCTION get_ename(p_empno IN NUMBER) RETURN VARCHAR2 IS
    l_ename VARCHAR2(240);
  BEGIN
    SELECT e.ename INTO l_ename FROM emp e WHERE e.empno = p_empno;
    RETURN l_ename;
  EXCEPTION
    WHEN OTHERS THEN
      RETURN NULL;
    
  END get_ename;
  PROCEDURE get_ename(p_empno IN NUMBER
                     ,p_ename IN OUT NOCOPY VARCHAR2) IS
    l_ename VARCHAR2(240);
  BEGIN
    SELECT e.ename INTO l_ename FROM emp e WHERE e.empno = p_empno;
    p_ename := l_ename;
  EXCEPTION
    WHEN OTHERS THEN
      p_ename := NULL;
  END get_ename;
END cux_jdbc_test;

然后调用存储函数

package org.example;

import java.sql.*;

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

public class J04 {
    public static void main() throws SQLException {
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@myhost:1521:ORCL");
        //建立连接
        Connection conn = ods.getConnection();
        //禁止默认提交
        conn.setAutoCommit(false);
        //创建语句
        PreparedStatement pstmt=null;
        try {

            CallableStatement cs = conn.prepareCall ("begin ? := cux_jdbc_test.get_ename(?); end;");
            cs.registerOutParameter(1,Types.VARCHAR);
            cs.setInt(2, 1500);
            cs.executeUpdate();
            String result = cs.getString(1);
            System.out.println(result);
        } finally {

            }


        //显示提交
        conn.commit();
    }
}

还可以调用函数

package org.example;

import java.sql.*;

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

public class J05 {
    public static void main() throws SQLException {
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@myhost:1521:ORCL");
        //建立连接
        Connection conn = ods.getConnection();
        //禁止默认提交
        conn.setAutoCommit(false);
        //创建语句
        PreparedStatement pstmt=null;
        try {

            CallableStatement cs = conn.prepareCall ("begin cux_jdbc_test.get_ename(?,?); end;");

            cs.setInt(1, 1500);

            cs.registerOutParameter(2,Types.VARCHAR);

            cs.executeUpdate();
            String result = cs.getString(2);
            System.out.println(result);
        } finally {

        }


        //显示提交
        conn.commit();
    }
}

调用函数时发现两个坑

1.如果函数返回的是布尔类型,无法调用,比如你不能使用cs.registerOutParameter(2,Types.BOOLEAN);去注册。解决办法是在包一层存储过程,此存储过程调用原来返回BOOLEAN类型的函数,然后返回varchar2类型或者number类型

2.有多个参数的时候,请使用operation=>?

代码如下

class GetFlex {
    public static final String operation = "CHECK_COMBINATION";
    public static final String appl_short_name = "SQLGL";
    public static final String key_flex_code = "GL#";
    // public static final NUMBER structure_number = new oracle.sql.NUMBER(50212);
    public static final Integer structure_number = 50212;

    //public String concat_segments="XXXX";
    public static void main(String args[]) throws SQLException {

        String concat_segments = "XXX.XXX.XXX.XXX";
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@XXXXXX");
        //建立连接
        Connection conn = ods.getConnection();
        //禁止默认提交
        conn.setAutoCommit(false);
        //创建语句
        PreparedStatement pstmt = null;
        try {

              CallableStatement cs = conn.prepareCall("begin ? :=  apps.fnd_flex_keyval.validate_segs(operation=>?,appl_short_name=>?,key_flex_code=>?,structure_number=>?,concat_segments=>?); end;");

            cs.registerOutParameter(1, Types.VARCHAR);
            cs.setString(2, operation);
            cs.setString(3, appl_short_name);
            cs.setString(4, key_flex_code);
            cs.setInt(5, structure_number);
            cs.setString(6, concat_segments);

            cs.executeUpdate();
            String result = cs.getString(1);

            System.out.println(result);


        } finally {

        }

        //显示提交
        // conn.commit();
    }
}

6.使用游标

package org.example;

import java.sql.*;

import oracle.jdbc.*;
import oracle.jdbc.pool.OracleDataSource;

public class J06 {
    public static void main() throws SQLException {
        OracleDataSource ods = new OracleDataSource();
        ods.setURL("jdbc:oracle:thin:apps/apps@myhost:1521:ORCL");
        //建立连接
        Connection conn = ods.getConnection();
        //禁止默认提交
        conn.setAutoCommit(false);
        //创建语句
        CallableStatement cstmt;
        ResultSet cursor;

        try {

            cstmt = conn.prepareCall
                    ("begin open ? for select ename ,empno from emp; end;");

            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.execute();
            cursor = ((OracleCallableStatement)cstmt).getCursor(1);
            while (cursor.next ())
            {System.out.println (cursor.getString(1));
                System.out.println (cursor.getInt(2));
            }

        } finally {

        }


        //显示提交
        conn.commit();
    }
}

你可能感兴趣的:(oracle,JAVA,oracle,数据库,database)