范例:定义一个简单的过程
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'; |
范例:查看与emp或dept表存在依赖关系的过程
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 ; |
范例:将CONNECT和RESOURCE角色授予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() ; // 数据库关闭 } } |