一、创建一个存储过程,批量清空数据库中所有表的数据。
--清空数据库中所有表的数据 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获取返回的。