JAVA调用存储过程:
几经挫折,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。
创建测试用表:
CREATE TABLE T_TEST(
I_ID NVARCHAR(20),
I_NAME NVARCHAR(20)
)
一:无返回值的存储过程
1、在SQL*PLUS中建立存储过程:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
INSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2);
END TESTA;
2、相应的JAVA程序:
package com.my.test;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureOne {
public TestProcedureOne() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "dbname", "password");
CallableStatement proc = null;
proc = conn.prepareCall("{ call dbname.TESTA(?,?) }");
proc.setString(1, "100");
proc.setString(2, "TestOne");
proc.execute();
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
二:有返回值的存储过程(非列表)
1、存储过程为:
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;
2、JAVA代码:
package com.my.test;
public class TestProcedureTWO {
public TestProcedureTWO() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "dbname", "password");
CallableStatement proc = null;
proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
proc.setString(1, "100");
proc.registerOutParameter(2, Types.VARCHAR);
proc.execute();
String testPrint = proc.getString(2);
System.out.println("=testPrint=is="+testPrint);
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
}
注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。
1、在SQL*PLUS中建一个程序包
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
procedure TESTC(cur_ref out Test_CURSOR);
end TESTPACKAGE;
建立存储过程,存储过程为:
create or replace package body TESTPACKAGE as
procedure TESTC(cur_ref out Test_CURSOR) is
begin
OPEN cur_ref FOR SELECT * FROM T_TEST;
end TESTC;
END TESTPACKAGE;
可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
JAVA程序如下:
package com.my.test;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureOne {
public TestProcedureOne() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl,"databasename" "password");
CallableStatement proc = null;
proc = conn.prepareCall("{ call cqsb.TESTA(?,?) }");
proc.setString(1, "100");
proc.setString(2, "TestOne");
proc.execute();
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
特别注意:
1、在执行前一定要先把oracle的驱动包放到class路径里。
2、Toad在我建立存储过程中搞了很多莫名的错误,多数是没有创建成功而不报错,或者是创建有误而不提示,应当引起重视。所以最好还是在SQL*PLUS玩这些。
3、在SQL*PLUS中的换行是无效的,要换行的时候一定要空格结尾,特别是你直接复制代码的时候!
几经挫折,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。
创建测试用表:
CREATE TABLE T_TEST(
I_ID NVARCHAR(20),
I_NAME NVARCHAR(20)
)
一:无返回值的存储过程
1、在SQL*PLUS中建立存储过程:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS
BEGIN
INSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2);
END TESTA;
2、相应的JAVA程序:
package com.my.test;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureOne {
public TestProcedureOne() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "dbname", "password");
CallableStatement proc = null;
proc = conn.prepareCall("{ call dbname.TESTA(?,?) }");
proc.setString(1, "100");
proc.setString(2, "TestOne");
proc.execute();
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
二:有返回值的存储过程(非列表)
1、存储过程为:
CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS
BEGIN
SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;
END TESTB;
2、JAVA代码:
package com.my.test;
public class TestProcedureTWO {
public TestProcedureTWO() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, "dbname", "password");
CallableStatement proc = null;
proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
proc.setString(1, "100");
proc.registerOutParameter(2, Types.VARCHAR);
proc.execute();
String testPrint = proc.getString(2);
System.out.println("=testPrint=is="+testPrint);
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
}
注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。
三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分。
1、在SQL*PLUS中建一个程序包
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;
procedure TESTC(cur_ref out Test_CURSOR);
end TESTPACKAGE;
建立存储过程,存储过程为:
create or replace package body TESTPACKAGE as
procedure TESTC(cur_ref out Test_CURSOR) is
begin
OPEN cur_ref FOR SELECT * FROM T_TEST;
end TESTC;
END TESTPACKAGE;
可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
JAVA程序如下:
package com.my.test;
import java.sql.*;
import java.io.OutputStream;
import java.io.Writer;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import oracle.jdbc.driver.*;
public class TestProcedureOne {
public TestProcedureOne() {
}
public static void main(String[] args ){
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.10.216:1521:ctbu";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl,"databasename" "password");
CallableStatement proc = null;
proc = conn.prepareCall("{ call cqsb.TESTA(?,?) }");
proc.setString(1, "100");
proc.setString(2, "TestOne");
proc.execute();
}
catch (SQLException ex2) {
ex2.printStackTrace();
}
catch (Exception ex2) {
ex2.printStackTrace();
}
finally{
try {
if(rs != null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch (SQLException ex1) {
}
}
}
}
特别注意:
1、在执行前一定要先把oracle的驱动包放到class路径里。
2、Toad在我建立存储过程中搞了很多莫名的错误,多数是没有创建成功而不报错,或者是创建有误而不提示,应当引起重视。所以最好还是在SQL*PLUS玩这些。
3、在SQL*PLUS中的换行是无效的,要换行的时候一定要空格结尾,特别是你直接复制代码的时候!
发表评论
-
SQL常用 to_char(),to_number
2012-07-20 10:58 196711.取得当前日期是本月的第几周 SQL> select ... -
JAVA调用oracle三种存储过程实例
2012-07-14 21:06 0JAVA调用存储过程: 几经挫折,但总算搞通了,为了避免后来者 ... -
利用HttpSessionListener实现网站在线人数统计功能
2012-07-12 00:21 1450在网站中经常需要进行在线人数的统计。过去的一般做法是结 ... -
HttpSession是干什么用的啊?能实现哪些功能?
2012-07-12 00:18 11511你听说过Session吗? 它 ... -
sql面试题
2012-07-11 23:25 1235Sql常用语法 下列语句部分是Mssql语句,不可以在acc ... -
java反射机制实例
2012-03-21 13:19 1184AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类 ... -
java反射机制实例
2012-03-21 13:18 0AVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类 ... -
什么是Cookies
2012-03-21 00:05 1053一.什么是Cookies?大家 ... -
struts2 doubleselect示例
2012-03-19 21:04 1034doubleselect算是Struts2中稍微复杂点的表单标 ... -
关于Java中各种修饰符与访问修饰符的说明
2011-12-21 11:16 1542类: 访问修饰符 修饰符 class 类名称 extend ... -
java通过SSH连linux运行shell ,解压linux上的压缩包
2011-12-20 17:35 2790在写代码前请下载:ganymed-ssh2-build210. ... -
@SuppressWarnings("unused")
2011-12-20 16:21 1118屏蔽java编译中的一些警告信息。unused这个参数是屏蔽: ... -
private static 和public static 的区别
2011-12-20 16:16 2216private static 和 public stati ... -
Toad常用快捷键
2011-12-06 11:19 949常用快捷键: F8 调出以前执行的sql命令 F9 执行全部s ... -
oracle comment on的用法
2011-09-29 09:10 1853oracle中用comment on命令给表或字段加以说明,语 ... -
SELECT INTO 和 INSERT INTO SELECT用法
2011-09-15 09:42 1301转自http://www.cnblogs.com/f ... -
TO_DATE格式
2011-09-06 11:13 5639转载 注意:oralce管理工具的不同,输出的结果也是 ... -
SQL 左外连接,右外连接,全连接,内连接
2011-09-05 14:08 780连接条件可在FROM或WHERE ... -
DECODE()函数
2011-09-02 16:16 785DECODE函数是ORACLE PL/SQL是功能强大的函数之 ... -
to_char格式化函数
2011-09-02 09:36 1032转自:http://www.cnblogs.com/rebor ...
相关推荐
以上代码展示了如何在Java中调用Oracle数据库的三种类型的存储过程:无返回值的存储过程、有单个返回值的存储过程以及返回列表的存储过程。对于无返回值的存储过程,主要涉及的是参数的输入,通过`execute()`方法...
在这个入门实例中,我们将重点探讨如何通过Java调用Oracle的存储过程来实现这些基本操作,并结合使用DOM4J解析XML配置文件来管理数据库连接。 首先,存储过程是Oracle数据库中预编译的SQL语句集合,它可以封装复杂...
### Java调用存储过程实例:详解 #### 存储过程简介 存储过程是一种在数据库中编写的SQL程序,可以接受输入参数,执行一系列操作,并返回结果或输出参数。它们可以提高应用程序的性能、安全性和复用性。在Oracle...
在Java编程中,调用Oracle数据库的存储...总之,通过Java调用Oracle存储过程,我们可以有效地执行数据库操作,同时利用存储过程带来的性能和安全优势。了解如何正确设置参数、执行和处理结果是成功实现这一目标的关键。
一个完整的java调用Oracle存储过程的实例,含存储过程和代码注释
### Java调用Oracle与SQL Server存储过程的通用方法 #### 1. **建立数据库连接** 在Java中,使用JDBC(Java Database Connectivity)来连接数据库。根据`dbType`参数动态选择正确的数据源,即Oracle或SQL Server的...
在Java编程中,调用Oracle数据库的存储过程是常见的任务,尤其在处理复杂业务逻辑或数据操作时。本文将深入探讨如何使用Java与...记住,实践是最好的老师,尝试编写一个简单的Java程序来调用Oracle存储过程,加深理解。
Java调用Oracle存储过程是数据库操作中常见的任务,特别是在需要执行复杂业务逻辑或者批量处理数据时。本篇文章将详细介绍如何通过Java与Oracle数据库交互,调用存储过程,并提供几个简单的实例帮助新手理解。 首先...
在Spring Boot应用中,调用Oracle数据库的存储过程有多种方式。本文主要介绍三种方法,包括使用`entityManagerFactory.unwrap(SessionFactory.class).openSession()`、直接使用`EntityManager`的`...
为了在Java中调用Oracle存储过程,我们需要使用JDBC(Java Database Connectivity)API。JDBC是Java平台的标准接口,用于与各种类型的数据库进行通信。以下是一步步教你如何实现的步骤: 1. **导入必要的库**: 在...
通过本文的探讨,我们不仅了解了如何在Java中调用Oracle存储过程并传递集合参数的基本原理,还深入实践了相关的技术细节。这对于构建高性能、高可靠性的企业级应用而言,是不可或缺的知识点。在未来,随着数据量的...
Oracle存储过程是数据库管理系统中的一种重要特性,它允许开发者编写包含一系列SQL语句和PL/SQL块的可重用代码段。在这个“Oracle的一个简单存储过程实例”中,我们可以看到如何在Oracle环境中创建、调用和管理存储...
总结起来,Java调用Oracle存储过程涉及JDBC、CallableStatement、参数设置以及结果获取等多个环节。理解这些概念并熟练运用,对于Java开发者来说是至关重要的,尤其是在处理与数据库交互的复杂业务场景中。
值得注意的是,上述代码中的文件名列表(如Project1.cfg、Unit1.dcu等)与Java调用存储过程无关,它们看起来像是Delphi或FreePascal项目的文件,这些文件通常用于描述项目配置、单元信息、表单布局等,而不是与Java...
CallabledStatement 是 Java 中的一种接口,用于调用存储过程。CallabledStatement interface 是 Statement 的一个子接口,提供了一些特殊的方法来调用存储过程。使用 CallabledStatement 可以提高应用程序的性能和...
在Java编程中,与Oracle数据库交互是常见的任务之一,而调用Oracle存储过程可以实现复杂的业务逻辑。本文将深入探讨如何在Java中调用Oracle存储过程,并输出自定义对象或二维表,以此提升数据处理效率。 首先,我们...
这篇博文(虽然链接未提供具体内容)可能探讨了如何在Java中调用Oracle存储过程,下面将详细介绍这个主题的相关知识点: 1. **JDBC API**:Java通过JDBC API与数据库通信,包括连接数据库、执行SQL语句和存储过程。...