zoukankan      html  css  js  c++  java
  • 子程序

     

     

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

    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() ; // 数据库关闭

    }

    }

  • 相关阅读:
    Spring Boot 3.日志
    Inspection info: Checks Spring Boot Application Setup. @SpringBootApplication used in default package Redundant @ComponentScan declaration Redundant @EnableAutoConfiguration declaration New in 2018.2
    mac下编译安装pcntl扩展
    php的if判断出现的问题思考
    php判断类的方法是否存在
    mac下phpstorm快捷键
    php关于always_populate_raw_post_data报错的解决方案
    如何使用mac快捷键打开终端
    linux文件权限管理(超详细)
    linux常用命令合集
  • 原文地址:https://www.cnblogs.com/doudouxiaoye/p/5804350.html
Copyright © 2011-2022 走看看