子程序

 

 

范例:定义一个简单的过程

CREATE OR REPLACE PROCEDURE mldn_proc

AS

BEGIN

DBMS_OUTPUT.put_line('www.mldnjava.cn') ;

END;

/

范例:定义过程,根据雇员编号找到雇员姓名及工资

CREATE OR REPLACE PROCEDURE get_emp_info_proc(p_eno emp.empno%TYPE)

AS

v_ename emp.ename%TYPE ;

v_sal emp.sal%TYPE ;

v_count NUMBER ;

BEGIN

SELECT COUNT(empno) INTO v_count FROM emp WHERE empno=p_eno ;

IF v_count = 0 THEN -- 没有发现数据

RETURN ; -- 结束过程调用

END IF ;

SELECT ename,sal INTO v_ename,v_sal FROM emp WHERE empno=p_eno ;

DBMS_OUTPUT.put_line('编号为' || p_eno  || '的雇员姓名:' || v_ename || ',工资:' || v_sal) ;

END;

/

 

范例:利用过程增加部门

CREATE OR REPLACE PROCEDURE dept_insert_proc(

p_dno dept.deptno%TYPE,

p_dna dept.dname%TYPE,

p_dlo dept.loc%TYPE)

AS

v_deptCount NUMBER ; -- 保存COUNT()函数结果

BEGIN

SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=p_dno ; -- 统计

IF v_deptCount > 0 THEN -- 有此编号的部门

RAISE_APPLICATION_ERROR(-20789,'增加失败:该部门已存在!') ;

ELSE

INSERT INTO dept(deptno,dname,loc) VALUES (p_dno,p_dna,p_dlo) ;

DBMS_OUTPUT.put_line('新部门增加成功!') ;

COMMIT ;

END IF ;

EXCEPTION

WHEN others THEN

DBMS_OUTPUT.put_line('SQLERRM = ' || SQLERRM) ;

ROLLBACK ; -- 事务回滚

END ;

/

 

范例:定义函数 —— 通过雇员编号查找此雇员的月薪

CREATE OR REPLACE FUNCTION get_salary_fun(p_eno emp.empno%TYPE)

RETURN NUMBER

AS

v_salary emp.sal%TYPE ;

BEGIN

SELECT sal + nvl(comm,0) INTO v_salary FROM emp WHERE empno=p_eno ;

RETURN v_salary ;

END;

/

范例:通过PL/SQL块验证函数

DECLARE

v_salary NUMBER ;

BEGIN

v_salary := get_salary_fun(7369) ;

DBMS_OUTPUT.put_line('雇员7369的工资为:' || v_salary) ;

END ;

/

范例:定义过程调用函数

CREATE OR REPLACE PROCEDURE invoke_proc

AS

v_salary NUMBER ;

BEGIN

v_salary := get_salary_fun(7369) ;

DBMS_OUTPUT.put_line('雇员7369的工资为:' || v_salary) ;

END ;

/

范例:通过SQL调用函数

SELECT get_salary_fun(7369) FROM dual ;

 

范例:使用CALL将函数的返回结果设置给变量

VAR v_salary NUMBER ;

CALL get_salary_fun(7369) INTO : v_salary ;

PRINT v_salary ;

范例:在使用的SQL语句中定义函数

COL isfive FOR A30 ;

WITH FUNCTION length_five_fun(p_str VARCHAR2) RETURN VARCHAR2

AS

BEGIN

IF (LENGTH(p_str) = 5) THEN

RETURN p_str || ',长度是5' ;

ELSE

RETURN p_str || ',长度不是5' ;

END IF ;

END ;

SELECT rownum,empno,ename,length_five_fun(ename) isfive,sal,comm FROM emp ;

/

 

范例:通过user_ procedures”查看所有过程

SELECT object_name,authid,object_type FROM user_procedures ;

 

范例:通过user_objects”查看所有用户创建的过程

SELECT object_name,created,timestamp,status

FROM user_objects

WHERE object_type='PROCEDURE' OR object_type='FUNCTION';

 

范例:查看与empdept表存在依赖关系的过程

SELECT name,type,referenced_name FROM user_dependencies

WHERE referenced_name='EMP' OR referenced_name='DEPT';

 

范例:修改dept表结构,为其增加一个photo的字段

ALTER TABLE dept ADD(photo VARCHAR2(50) DEFAULT 'nophoto.jpg') ;

 

范例:表结构修改完成后再次查看dept_insert_proc过程信息

SELECT object_name,created,timestamp,status

FROM user_objects

WHERE object_type='PROCEDURE' AND object_name='DEPT_INSERT_PROC' ;

 

范例:删除增加的photo字段

ALTER TABLE dept DROP COLUMN photo ;

范例:重新编译过程

ALTER PROCEDURE dept_insert_proc COMPILE ;

范例:通过user_source”查看myproc过程定义内容

SELECT * FROM user_source WHERE name='MLDN_PROC' ;

 

范例:查看get_salary_fun()函数的源代码

SELECT * FROM user_source WHERE name='GET_SALARY_FUN' ;

 

范例:删除mldn_proc过程

DROP PROCEDURE mldn_proc ;

 

范例:删除get_salary_fun()函数

DROP FUNCTION get_salary_fun ;

范例:查看user_procedures数据字典,查找所有过程

SELECT object_name,authid,object_type FROM user_procedures ;

 

范例:定义过程,使用IN参数模式

CREATE OR REPLACE PROCEDURE in_proc(

p_paramA IN VARCHAR2,-- 明确定义IN参数模式

p_paramB VARCHAR2)-- 默认的参数模式为IN

AS

BEGIN

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramB = ' || p_paramB) ;

END ;

/

范例:定义一个PL/SQL块,调用过程

DECLARE

v_titleA VARCHAR2(50) := 'Java开发实战经典';

v_titleB VARCHAR2(50) := 'Android开发实战经典' ;

BEGIN

in_proc(v_titleA , v_titleB) ;

END ;

/

范例:定义过程,使用DEFAULT定义参数默认值

CREATE OR REPLACE PROCEDURE in_proc(

p_paramA IN VARCHAR2 ,

p_paramB VARCHAR2 DEFAULT 'Oracle开发实战经典') -- 设置默认值

AS

BEGIN

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行in_proc()过程:p_paramB = ' || p_paramB) ;

END ;

/

范例:调用过程,少传一个参数

DECLARE

v_titleA VARCHAR2(50) := 'Java开发实战经典';

BEGIN

in_proc(v_titleA ) ;

END ;

/

范例:在函数之中使用IN参数模式

CREATE OR REPLACE FUNCTION in_fun(

p_paramA IN VARCHAR2 ,

p_paramB VARCHAR2 DEFAULT 'Oracle开发实战经典')

RETURN VARCHAR2

AS

BEGIN

RETURN 'Android开发实战经典' ;

END;

/

范例:编写PL/SQL块调用函数

DECLARE

v_titleA VARCHAR2(50) := 'Java开发实战经典';

v_return VARCHAR2(50) ;

BEGIN

v_return := in_fun(v_titleA) ;

DBMS_OUTPUT.put_line('in_fun()函数返回值:v_return = ' || v_return) ;

END ;

/

范例:定义过程,使用OUT参数模式

CREATE OR REPLACE PROCEDURE out_proc(

p_paramA OUT VARCHAR2, -- OUT参数模式

p_paramB OUT VARCHAR2) -- OUT参数模式

AS

BEGIN

DBMS_OUTPUT.put_line('执行out_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行out_proc()过程:p_paramB = ' || p_paramB) ;

p_paramA := 'Java开发实战经典' ; -- 此值将返回给实参

p_paramB := 'Android开发实战经典' ; -- 此值将返回给实参

END ;

/

范例:定义PL/SQL块调用过程

DECLARE

v_titleA VARCHAR2(100) := '此处只是声明一个接收返回数据的标记';

v_titleB VARCHAR2(100) := '此内容不会传递到过程,但是过程会将修改内容传回' ;

BEGIN

out_proc(v_titleA , v_titleB) ;

DBMS_OUTPUT.put_line('调用out_proc()过程之后变量内容:v_titleA = ' || v_titleA) ;

DBMS_OUTPUT.put_line('调用out_proc()过程之后变量内容:v_titleB = ' || v_titleB) ;

END ;

/

范例:定义函数使用OUT模式

CREATE OR REPLACE FUNCTION out_fun(

p_paramA OUT VARCHAR2, -- OUT参数模式

p_paramB OUT VARCHAR2) -- OUT参数模式

RETURN VARCHAR2

AS

BEGIN

p_paramA := 'Java开发实战经典' ; -- 此值将返回给实参

p_paramB := 'Android开发实战经典' ; -- 此值将返回给实参

RETURN 'Oracle开发实战经典' ; -- 返回数据

END ;

/

范例:编写PL/SQL块调用函数

DECLARE

v_titleA VARCHAR2(100) := '随便写的,只为接收内容' ;

v_titleB VARCHAR2(100) := '内容不会传递的' ;

v_return VARCHAR2(100) ; -- 接收返回内容

BEGIN

v_return := out_fun(v_titleA , v_titleB) ;

DBMS_OUTPUT.put_line('调用out_fun()函数之后变量内容:v_titleA = ' || v_titleA) ;

DBMS_OUTPUT.put_line('调用out_fun()函数之后变量内容:v_titleB = ' || v_titleB) ;

DBMS_OUTPUT.put_line('调用out_fun()函数的返回值:v_return = ' || v_return) ;

END ;

/

 

范例:定义过程,使用IN OUT参数模式

CREATE OR REPLACE PROCEDURE inout_proc(

p_paramA IN OUT VARCHAR2,-- IN OUT参数模式

p_paramB IN OUT VARCHAR2 )-- IN OUT参数模式

AS

BEGIN

DBMS_OUTPUT.put_line('执行inout_proc()过程:p_paramA = ' || p_paramA) ;

DBMS_OUTPUT.put_line('执行inout_proc()过程:p_paramB = ' || p_paramB) ;

p_paramA := 'Java开发实战经典' ; -- 此值将返回给实参

p_paramB := 'Android开发实战经典' ; -- 此值将返回给实参

END ;

/

范例:定义PL/SQL块,调用过程

DECLARE

v_titleA VARCHAR2(50) := 'Java WEB开发实战经典';

v_titleB VARCHAR2(50) := 'Oracle开发实战经典' ;

BEGIN

inout_proc(v_titleA , v_titleB) ;

DBMS_OUTPUT.put_line('调用inout_proc()过程之后变量内容:v_titleA = ' || v_titleA) ;

DBMS_OUTPUT.put_line('调用inout_proc()过程之后变量内容:v_titleB = ' || v_titleB) ;

END ;

/

范例:利用过程增加部门

CREATE OR REPLACE PROCEDURE dept_insert_proc(

p_dno dept.deptno%TYPE,

p_dna dept.dname%TYPE,

p_dlo dept.loc%TYPE ,

p_result OUT NUMBER) -- 此为操作标记变量

AS

v_deptCount NUMBER ; -- 保存COUNT()函数结果

BEGIN

SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=p_dno ; -- 统计

IF v_deptCount > 0 THEN -- 有此编号的部门

p_result := -1 ; -- 修改返回标记

ELSE

INSERT INTO dept(deptno,dname,loc) VALUES (p_dno,p_dna,p_dlo) ;

p_result := 0 ; -- 修改返回标记

COMMIT ;

END IF ;

END ;

/

范例:编写PL/SQL块调用

DECLARE

v_result NUMBER ; -- 接收结果

BEGIN

dept_insert_proc(66,'MLDN','中国',v_result) ; -- 调用过程

IF v_result = 0 THEN

DBMS_OUTPUT.put_line('新部门增加成功!') ;

ELSE

DBMS_OUTPUT.put_line('部门增加失败!') ;

END IF ;

END ;

/

范例:定义变量调用过程返回

var v_result NUMBER ;

EXEC dept_insert_proc(50,'魔乐科技','北京',:v_result) ;

print v_result ;

范例:通过函数完成部门增加

CREATE OR REPLACE FUNCTION dept_insert_fun(

p_dno dept.deptno%TYPE,

p_dna dept.dname%TYPE,

p_dlo dept.loc%TYPE)

RETURN NUMBER -- 返回操作结果

AS

v_deptCount NUMBER ; -- 保存COUNT()函数结果

BEGIN

SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=p_dno ; -- 统计

IF v_deptCount > 0 THEN -- 有此编号的部门

RETURN -1 ; -- 返回失败标记

ELSE

INSERT INTO dept(deptno,dname,loc) VALUES (p_dno,p_dna,p_dlo) ;

COMMIT ;

RETURN 0 ; -- 返回成功标记

END IF ;

END ;

/

范例:调用函数

DECLARE

v_result NUMBER ; -- 接收结果

BEGIN

v_result := dept_insert_fun(63,'MLDNJAVA','中国') ; -- 调用函数

IF v_result = 0 THEN

DBMS_OUTPUT.put_line('新部门增加成功!') ;

ELSE

DBMS_OUTPUT.put_line('部门增加失败!') ;

END IF ;

END ;

/

范例:定义嵌套过程

CREATE OR REPLACE PROCEDURE dept_insert_proc(

p_dno dept.deptno%TYPE,

p_dna dept.dname%TYPE,

p_dlo dept.loc%TYPE ,

p_result OUT NUMBER)

AS

v_deptCount NUMBER ; -- 保存COUNT()函数结果

PROCEDURE get_dept_count_proc(-- 定义嵌套过程,判断部门编号是否存在

p_temp dept.deptno%TYPE ,

p_count OUT NUMBER) -- 返回统计结果

AS

BEGIN

SELECT COUNT(deptno) INTO p_count FROM dept WHERE deptno=p_temp ;-- 统计

END ;

PROCEDURE insert_operate_proc(-- 定义嵌套过程,执行增加

p_temp_dno dept.deptno%TYPE,

p_temp_dna dept.dname%TYPE,

p_temp_dlo dept.loc%TYPE ,

p_count NUMBER ,

p_flag OUT NUMBER)-- 通过此参数返回结果

AS

BEGIN

IF p_count > 0 THEN-- 有此编号的部门

p_flag := -1 ;

ELSE

INSERT INTO dept(deptno,dname,loc) VALUES (p_temp_dno , p__tempdna , p_tempdlo) ;

p_flag := 0 ;-- 修改返回标记

COMMIT ;

END IF ;

END ;

BEGIN

get_dept_count_proc(p_dno , v_deptCount) ; -- 判断是否有此部门

insert_operate_proc(p_dno,p_dna,p_dlo,v_deptCount,p_result) ;

END ;

/

范例:简化定义

CREATE OR REPLACE PROCEDURE dept_insert_proc(

p_dno dept.deptno%TYPE ,

p_dna dept.dname%TYPE ,

p_dlo dept.loc%TYPE ,

p_result OUT NUMBER)

AS

v_deptCount NUMBER ; -- 保存COUNT()函数结果

PROCEDURE get_dept_count_proc-- 返回统计结果

AS

BEGIN

SELECT COUNT(deptno) INTO v_deptCount FROM dept WHERE deptno=p_dno ;-- 统计

END ;

PROCEDURE insert_operate_proc

AS

BEGIN

IF v_deptCount > 0 THEN

p_result := -1 ;

ELSE

INSERT INTO dept(deptno,dname,loc) VALUES (p_dno,p_dna,p_dlo) ;

p_result := 0 ;

COMMIT ;

END IF ;

END ;

BEGIN

get_dept_count_proc() ; -- 查询个数

insert_operate_proc() ;

END ;

/

范例:定义错误的子程序调用

DECLARE

PROCEDURE a_proc(p_paramA NUMBER)

AS

BEGIN

DBMS_OUTPUT.put_line('A过程,p_paramA = ' || p_paramA) ;

b_proc('www.mldnjava.cn') ;

END ;

PROCEDURE b_proc(p_paramB VARCHAR2)

AS

BEGIN

DBMS_OUTPUT.put_line('B过程,p_paramB = ' || p_paramB) ;

a_proc(100) ;

END ;

BEGIN

NULL ;

END ;

/

范例:使用前导声明

DECLARE

PROCEDURE b_proc(p_paramB VARCHAR2) ;-- 前导声明

PROCEDURE a_proc(p_paramA NUMBER)

AS

BEGIN

DBMS_OUTPUT.put_line('A过程,p_paramA = ' || p_paramA) ;

b_proc('www.mldnjava.cn') ;

END ;

PROCEDURE b_proc(p_paramB VARCHAR2)

AS

BEGIN

DBMS_OUTPUT.put_line('B过程,p_paramB = ' || p_paramB) ;

a_proc(100) ;

END ;

BEGIN

NULL ;

END ;

/

范例:实现过程重载

DECLARE

PROCEDURE get_dept_info_proc(p_deptno dept.deptno%TYPE) AS

BEGIN

DBMS_OUTPUT.put_line('部门编号:' || p_deptno) ;

END ;

PROCEDURE get_dept_info_proc(p_dname dept.dname%TYPE) AS

BEGIN

DBMS_OUTPUT.put_line('部门名称:' || p_dname) ;

END ;

BEGIN

get_dept_info_proc(30) ;

get_dept_info_proc('魔乐科技') ;

END ;

/

范例:定义函数,返回嵌套表类型数据

DECLARE

TYPE emp_nested IS TABLE OF emp%ROWTYPE ;

v_emp_return emp_nested ;

FUNCTION dept_emp_fun(p_dno emp.deptno%TYPE) RETURN emp_nested

AS

v_emp_temp emp_nested ;

BEGIN

SELECT * BULK COLLECT INTO v_emp_temp FROM emp WHERE deptno=p_dno ;

RETURN v_emp_temp ;

END ;

BEGIN

BEGIN

v_emp_return := dept_emp_fun(10) ;

FOR x IN v_emp_return.FIRST .. v_emp_return.LAST LOOP

DBMS_OUTPUT.put_line('雇员编号:' || v_emp_return(x).empno || ',姓名:' || v_emp_return(x).ename || ',职位:' || v_emp_return(x).job) ;

END LOOP ;

EXCEPTION

WHEN others THEN

DBMS_OUTPUT.put_line('此部门没有雇员!') ;

END ;

END ;

/

范例:实现函数递归调用

DECLARE

v_sum NUMBER ;

FUNCTION add_fun(p_num NUMBER)

RETURN NUMBER

AS

BEGIN

IF p_num = 1 THEN

RETURN 1 ;

ELSE

RETURN p_num + add_fun(p_num - 1) ;

END IF ;

END ;

BEGIN

v_sum := add_fun(100) ; -- 进行1~100累加

DBMS_OUTPUT.put_line('累加结果:' || v_sum) ;

END ;

/

 

范例:使用NOCOPY定义过程参数

DECLARE

TYPE dept_nested IS TABLE OF dept%ROWTYPE ;

v_dept dept_nested ;

PROCEDURE useNocopy_proc(p_temp IN OUT NOCOPY dept_nested)

IS

BEGIN

-- 相关程序代码

END ;

BEGIN

SELECT * BULK COLLECT INTO v_dept FROM dept ; -- 将雇员表全部数据拷贝到嵌套表之中

v_dept.EXTEND(2000000,1) ; -- 将集合扩充,数据以第1条记录为准进行填充

useNocopy_proc(v_dept) ; -- 使用NOCOPY

END ;

/

范例:使用NOCOPY选项 —— 即使出现错误,NOCOPY也可以自动处理

DECLARE

v_varA NUMBER := 10 ;

v_varB NUMBER := 20 ;

PROCEDURE change_proc(

p_paramINOUT IN OUT NUMBER ,

p_paramNOCOPY IN OUT NOCOPY NUMBER)

IS

BEGIN

p_paramINOUT := 100 ;

p_paramNOCOPY := 100 ;

RAISE_APPLICATION_ERROR(-20001 , '测试NOCOPY.') ;

END ;

BEGIN

DBMS_OUTPUT.put_line('【过程调用之前】v_varA = ' || v_varA || 'v_varB = ' || v_varB) ;

BEGIN

change_proc(v_varA , v_varB) ;

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.put_line('SQLCODE = ' || SQLCODE || 'SQLERRM = ' || SQLERRM) ;

END ;

DBMS_OUTPUT.put_line('【过程调用之后】v_varA = ' || v_varA || 'v_varB = ' || v_varB) ;

END ;

/

范例:不使用NOCOPY选项

DECLARE

v_varA NUMBER := 10 ;

v_varB NUMBER := 20 ;

PROCEDURE change_proc(

p_paramINOUT IN OUT NUMBER ,

p_paramNOCOPY IN OUT NOCOPY NUMBER)

IS

BEGIN

p_paramINOUT := 100 ;

p_paramNOCOPY := 100 ;

END ;

BEGIN

DBMS_OUTPUT.put_line('【过程调用之前】v_varA = ' || v_varA || 'v_varB = ' || v_varB) ;

change_proc(v_varA , v_varB) ;

DBMS_OUTPUT.put_line('【过程调用之后】v_varA = ' || v_varA || 'v_varB = ' || v_varB) ;

END ;

/

 

范例:使用自治事务

DECLARE

PROCEDURE dept_insert_proc AS

PRAGMA AUTONOMOUS_TRANSACTION;-- 自治事务

BEGIN

-- 此处更新将使用自治事务,主事务将被挂起

INSERT INTO dept(deptno,dname,loc) VALUES (60,'MLDN','北京') ;

COMMIT ; -- 提交自治事务

END ;

BEGIN

INSERT INTO dept(deptno,dname,loc) VALUES (50,'开发部','天津') ;

dept_insert_proc() ;

ROLLBACK ;-- 此处为主事务回滚

END ;

/

 

范例:查看dept表记录

SELECT * FROM dept ;

 

范例:使用nolog方式打开sqlplus

sqlplus /nolog

 

范例:使用sys用户登录

CONN sys/change_on_install AS SYSDBA ;

 

范例:创建一个新用户c##mldnuser,密码为c##mldnjava

CREATE USER c##mldnuser IDENTIFIED BY mldnjava ;

 

范例:CONNECTRESOURCE角色授予c##mldnuser用户

GRANT CONNECT,RESOURCE TO c##mldnuser ;

 

范例:重新使用c##scott用户登录

CONN c##scott/tiger ;

 

范例:创建一个bonus_proc的过程

CREATE OR REPLACE PROCEDURE bonus_proc AS

BEGIN

INSERT INTO bonus(ename,job,sal,comm) VALUES ('李兴华','程序员',5000,2000) ;

COMMIT ;

END ;

/

 

范例:bonus_proc子程序的执行权限授予c##mldnuser用户

GRANT EXECUTE ON c##scott.bonus_proc TO c##mldnuser ;

 

范例:使用c##mldnuser登录

CONN c##mldnuser/mldnjava ;

范例:c##mldnuser用户下执行bonus_proc过程

EXEC c##scott.bonus_proc ;

范例:创建与c##scott.bonus相同名称且结构相同的数据表

DROP TABLE bonus PURGE ;

CREATE TABLE bonus (

ename VARCHAR2(10) ,

job VARCHAR2(9) ,

sal NUMBER ,

comm NUMBER

) ;

范例:c##scott中重新定义过程

CREATE OR REPLACE PROCEDURE bonus_proc

AUTHID CURRENT_USER AS

BEGIN

INSERT INTO bonus(ename,job,sal,comm) VALUES ('张三','程序员',5000,2000) ;

COMMIT ;

END ;

/

 

范例:定义过程mldn_proc

DROP PROCEDURE mldn_proc ;

CREATE OR REPLACE PROCEDURE mldn_proc (p1 IN NUMBER , p2 IN OUT NUMBER , p3 OUT NUMBER) AS

BEGIN

p2 := 20 ; -- 设置p2的内容为20

p3 := 30 ; -- 设置p3的内容为30

END ;

/

 

范例:查询此过程信息

SELECT * FROM user_source WHERE name='MLDN_PROC' ;

 

范例:利用JDBC技术调用myproc过程

package cn.mldn.demo;

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.Types;

public class ProcDemo {

// 定义Oracle的数据库驱动程序

public static final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;

// 定义Oracle数据库的连接地址

public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:MLDN" ;

// Oracle数据库的连接用户名

public static final String DBUSER = "c##scott" ;

// Oracle数据库的连接密码

public static final String DBPASS = "tiger" ;

public static void main(String[] args) throws Exception {

Connection conn = null ; // 数据库连接

CallableStatement cstmt = null ; // 数据库操作

String sql = "{CALL mldn_proc(?,?,?)}" ; // 调用过程

Class.forName(DBDRIVER) ; // 加载驱动程序

// 连接MySQL数据库时,要写上连接的用户名和密码

conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);

cstmt = conn.prepareCall(sql) ; // 实例化对象

cstmt.setInt(1, 70) ; // 设置第一个参数是70

cstmt.setInt(2, 80) ; // 设置第一个参数是80

cstmt.registerOutParameter(2, Types.INTEGER) ; // 设置返回值类型

cstmt.registerOutParameter(3, Types.INTEGER) ; // 设置返回值类型

cstmt.execute() ; // 执行存储过程

System.out.println("INOUT的返回值:" + cstmt.getInt(2));

System.out.println("OUT的返回值:" + cstmt.getInt(3));

cstmt.close() ; // 操作关闭

conn.close() ; // 数据库关闭

}

}

原文地址:https://www.cnblogs.com/doudouxiaoye/p/5804350.html