zoukankan      html  css  js  c++  java
  • 关于oracle存储过程的一些知识点

    一、创建一个存储过程,批量清空数据库中所有表的数据。

    --清空数据库中所有表的数据
    create or replace procedure truncateAllTables as
    v_sql varchar2(2000);
    CURSOR cur is
           select table_name from user_tables order by table_name;
    begin
    --dbms_output.put_line('1111');
    for rows in cur loop
    v_sql := 'truncate table ' || rows.table_name;
    --dbms_output.put_line(v_sql);
    execute immediate v_sql;
    end loop;
    end;

    执行存储过程如下:

    exec truncateAllTables;

    二、如何在plsql中调用一个有参数的存储过程呢?

    比如这样一个存储过程:

    create or replace procedure proc_CpNumber(cpNumber out varchar2) is
    begin
       ....
       -- 一些调试信息
       dbms_output.put_line('==0'||cpNumber);
       dbms_output.put_line('==0'||length(cpNumber));
       --赋值
       select 'E'||(to_number(substr(cpNumber,2,10))+1) into cpNumber from dual;
       ......
    end;

    调用方法如下:

    --调用带有参数的存储过程
    declare
    cp_number varchar2(2000);
    begin
    proc_CpNumber(cp_number);
    dbms_output.put_line(cp_number);
    end;
    /

    三、在java代码中调用上面带有输出参数的存储过程如下:

    public class OracleDBHelper {
        static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
        //开发环境
        static final String URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
        
        static final String USER = "test123";
        static final String PWD = "test123";
        
        private OracleDBHelper() {
            
        }
        private static Connection con = null;
    
        public static Connection getConnection() {
            if(con == null) {
                try {
                    Class.forName(DRIVER);
                    con = DriverManager.getConnection(URL, USER, PWD);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            return con;
        }
        
        public static void main(String[] args) throws Exception {
            CallableStatement cStatement = OracleDBHelper.getConnection().prepareCall("{call proc_cpnumber(?)}");
            cStatement.setString(1, "aa");
            cStatement.registerOutParameter(1, java.sql.Types.VARCHAR);
            cStatement.execute();
            System.out.println(cStatement.getString(1));
            OracleDBHelper.getConnection().close();
        }
    }

    四、如果使用了mybatis框架,则调用上述存储过程,方法如下

    首先定义调用的语句。

    <select id="proc_cpnumber" statementType="CALLABLE" parameterType="java.util.HashMap" resultType="java.util.HashMap">   
    <![CDATA[   
        {call proc_cpnumber(#{eNumber,mode=OUT,jdbcType=VARCHAR})}   
    ]]>   
    </select>

    java代码调用如下:

        public synchronized String getNumber() {
            String eNumber = "";
            Map map=new HashMap();
            getSqlSession().selectOne("proc_cpnumber",map);
            eNumber=(String)map.get("eNumber");
            return eNumber;
        }

    其中为了保证获取到的number的唯一性,需要加上同步锁。其中getSqlSession是通过注入的SqlSessionDao的getSqlSession获取返回的。

  • 相关阅读:
    查看.Net Framework的版本(PC和WinCE)
    .NET C# 创建WebService服务简单的例子
    ORA-01502错误成因和解决方法
    高水线 High water mark(HWM)
    Oracle高水位线(HWM)及性能优化
    解决(Oracle)ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接 问题
    ORACLE切非归档模式:
    ArcGIS学习记录—dbf shp shx sbn sbx mdb adf等类型的文件的解释
    ArcGIS学习记录—ArcGIS ArcMap编辑状态中线打断的问题
    ArcGIS学习记录—Arcgis中点、线、面的相互转换方法
  • 原文地址:https://www.cnblogs.com/wenwujuncheng/p/3580999.html
Copyright © 2011-2022 走看看