public class JdbcTest {
private Connection conn = null;
private PreparedStatement pst = null;
private ResultSet rs = null;
@Before
public void init() throws Exception {
//加载数据库驱动
Class.forName(driver);
//获取Connection对象
conn = DriverManager.getConnection(url, username, password);
}
@After
public void close() throws Exception{
//释放资源
if(rs!=null)
rs.close();
if(pst!=null)
pst.close();
if(conn!=null)
conn.close();
}
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@192.168.197.10:1521:orcl";
String username = "scott";
String password = "tiger";
//查询oracle数据库中scott用户下emp表记录
@Test
public void findEmps() throws Exception {
//获取PreparedStatement
pst = conn.prepareStatement("select * from emp");
//执行sql
rs = pst.executeQuery();
//处理ResultSet
while(rs.next()){
System.out.println("编号:"+rs.getInt("empno")+",姓名:"+rs.getString("ename"));
}
}
/**
* @Description: 调用存储过程
*
* create or replace procedure pro_add_sal(eno in number,money in number)
*
*
* CallableStatement
* 用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使用
*标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数,
*则必须将其注册为 OUT 参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,第一个
*参数的编号是 1。
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用函数
{call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用过程
*/
@Test
public void callProcedure() throws Exception {
//加载数据库驱动
Class.forName(driver);
//获取Connection对象
Connection conn = DriverManager.getConnection(url, username, password);
//返回执行存储过程接口
CallableStatement cst = conn.prepareCall("{call pro_add_sal(?, ?)}");
//设置参数值
cst.setInt(1, 7369);
cst.setInt(2, 100);
//执行过程
cst.execute();
//释放资源
if(cst!=null)
cst.close();
if(conn!=null)
conn.close();
}
/**
* @Description: 调用存储过程有输出结果
*
* create or replace procedure pro_total_sal(eno in number, t out number)
*
* CallableStatement
* 用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使用
*标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数,
*则必须将其注册为 OUT 参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,第一个
*参数的编号是 1。
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用函数
{call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用过程
*/
@Test
public void callProcedureOutParmeter() throws Exception {
//加载数据库驱动
Class.forName(driver);
//获取Connection对象
Connection conn = DriverManager.getConnection(url, username, password);
//返回执行存储过程接口
CallableStatement cst = conn.prepareCall("{call pro_total_sal(?, ?)}");
//设置参数值
cst.setInt(1, 7369);
//注册为 OUT 参数 void registerOutParameter(int parameterIndex, int sqlType)
//按顺序位置 parameterIndex 将 OUT 参数注册为 JDBC 类型 sqlType。
cst.registerOutParameter(2, OracleTypes.NUMBER);
//执行过程
cst.execute();
//获取返回输出参数结果
System.out.println(cst.getObject(2));
//释放资源
if(cst!=null)
cst.close();
if(conn!=null)
conn.close();
}
/**
* @Description: 调用存储过程有输出参数是游标类型
*
* create procedure pro_emp_list(dno in number, emplist out sys_refcursor)
*
* CallableStatement
* 用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使用
*标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数,
*则必须将其注册为 OUT 参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,第一个
*参数的编号是 1。
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用函数
{call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用过程
*/
@Test
public void callProcedureOutParmeterCursor() throws Exception {
//加载数据库驱动
Class.forName(driver);
//获取Connection对象
Connection conn = DriverManager.getConnection(url, username, password);
//返回执行存储过程接口
CallableStatement cst = conn.prepareCall("{call pro_emp_list(?, ?)}");
//设置参数值
cst.setInt(1, 20);
//注册为 OUT 参数 void registerOutParameter(int parameterIndex, int sqlType)
//按顺序位置 parameterIndex 将 OUT 参数注册为 JDBC 类型 sqlType。
cst.registerOutParameter(2, OracleTypes.CURSOR);
//执行过程
cst.execute();
//获取返回输出参数结果
OracleCallableStatement ocs = (OracleCallableStatement) cst;
ResultSet rs = ocs.getCursor(2);
while(rs.next()){
System.out.println(rs.getString("ename"));
}
//释放资源
if(ocs!=null)
ocs.close();
if(cst!=null)
cst.close();
if(conn!=null)
conn.close();
}
/**
* @Description: 调用函数
*
* create or replace function fun_emp_toalsal(eno in number) return number
*
* CallableStatement
* 用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使用标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数,则必须将其注册为 OUT 参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,第一个参数的编号是 1。
{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用函数
{call <procedure-name>[(<arg1>,<arg2>, ...)]} --调用过程
*/
@Test
public void callFunction() throws Exception {
//加载数据库驱动
Class.forName(driver);
//获取Connection对象
Connection conn = DriverManager.getConnection(url, username, password);
//返回执行存储过程接口
CallableStatement cst = conn.prepareCall("{? = call fun_emp_toalsal(?)}");
//设置参数值
cst.setInt(2, 7369);
//注册为 OUT 参数 void registerOutParameter(int parameterIndex, int sqlType)
//按顺序位置 parameterIndex 将 OUT 参数注册为 JDBC 类型 sqlType。
cst.registerOutParameter(1, OracleTypes.NUMBER);
//执行过程
cst.execute();
//获取返回输出参数结果
System.out.println(cst.getObject(1));
//释放资源
if(cst!=null)
cst.close();
if(conn!=null)
conn.close();
}
}
相关文章
- 二维数组的使用及函数调用
- MySQL自定义函数与存储过程的创建、使用、删除
- C#委托(delegate)的常用方式- 委托的定义 // 委托的核心是跟委托的函数结构一样 public delegate string SayHello(string c); public delegate string SayHello(string c);:定义了一个公共委托类型 SayHello,该委托接受一个 string 类型的参数 c,并返回一个 string 类型的值。 Main 方法 static void Main(string args) { // 本质上其实就是把方法当作委托的参数 SayHello sayC = new SayHello(SayChinese); Console.WriteLine(sayC("欢迎大家")); SayHello sayE = new SayHello(SayEgnlish); Console.WriteLine(sayE("Welcome to")); // 简单的写法:必须类型一样 SayHello s1 = SayChinese; SayHello s2 = SayEgnlish; Console.WriteLine(s1("好好好")); Console.WriteLine(s2("Gooood")); // 最推荐 SayHello ss1 = con => con; Console.WriteLine(ss1("niiiice")); // 匿名委托:一次性委托 SayHello ss3 = delegate(string s) { return s; }; Console.WriteLine(ss3("说中国话")); } 常规实例化委托 SayHello sayC = new SayHello(SayChinese);:创建了一个 SayHello 委托的实例 sayC,并将 SayChinese 方法作为参数传递给委托的构造函数。 Console.WriteLine(sayC("欢迎大家"));:通过委托实例调用 SayChinese 方法,并输出结果。 同理,SayHello sayE = new SayHello(SayEgnlish); 和 Console.WriteLine(sayE("Welcome to")); 是对 SayEgnlish 方法的委托调用。 简化的委托赋值方式 SayHello s1 = SayChinese; 和 SayHello s2 = SayEgnlish;:当委托类型和方法签名一致时,可以直接将方法赋值给委托变量,无需使用 new 关键字。 Console.WriteLine(s1("好好好")); 和 Console.WriteLine(s2("Gooood"));:通过委托实例调用相应的方法。 使用 Lambda 表达式实例化委托 SayHello ss1 = con => con;:使用 Lambda 表达式创建委托实例 ss1,con => con 表示接受一个参数 con 并返回该参数本身。 Console.WriteLine(ss1("niiiice"));:通过委托实例调用 Lambda 表达式。 匿名委托 SayHello ss3 = delegate(string s) { return s; };:使用匿名委托创建委托实例 ss3,delegate(string s) { return s; } 是一个匿名方法,直接在委托实例化时定义了方法体。 Console.WriteLine(ss3("说中国话"));:通过委托实例调用匿名方法。 委托引用的方法定义 public static string SayChinese(string content) { return content; } public static string SayEgnlish(string content) { return content; } public static string SayChinese(string content) 和 public static string SayEgnlish(string content):定义了两个静态方法,分别接受一个 string 类型的参数 content,并返回该参数本身。这两个方法的签名与 SayHello 委托一致,可以被 SayHello 委托引用。 常规的委托实例化、简化的赋值方式、Lambda 表达式和匿名委托。委托在 C# 中是一种强大的机制,它允许将方法作为参数传递,实现了代码的灵活性和可扩展性。
- HTML中的函数使用基础(函数定义,函数调用,函数参数,函数返回值,嵌套函数,递归函数,变量作用域,内置函数,其他定义函数的方法)
- Python中使用cx_Oracle调用Oracle存储过程
- C# 中使用特性获得函数被调用的路径,行号和函数
- Linux Debugging(七): 使用反汇编理解动态库函数调用方式GOT/PLT
- 不允许调用库函数,也不允许使用任何全局或局部变量编写strlen函数
- MySQL视图view/存储过程和函数的使用
- Mysql5.7创建存储过程中调用自定义函数报错Not allowed to return a result set from a function