pl/sql
创新互联是一家专业提供蚌埠企业网站建设,专注与成都做网站、成都网站设计、成都外贸网站建设、H5响应式网站、小程序制作等业务。10年已为蚌埠众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
里面定义的包在调用的时候使用exec
命令调用,例如:exec
package_name.过程名()
过程名():包体里面定义的公用过程。
不知道我的回答你清楚了吗?
一 先在oracle中编写测试过程
首选建一个测试表
Create tablecreate table BOOK( BOOKID VARCHAR ( ) not null BOOKNAME VARCHAR ( ) not null PUBLISHER VARCHAR ( ) not null PRICE VARCHAR ( ) null)
编写ORACLE测试过程
CREATE OR REPLACE PACKAGE pkg_testAS TYPE myrctype IS REF CURSOR;
PROCEDURE get (p_id VARCHAR p_str OUT VARCHAR p_rc OUT myrctype);END pkg_test;
/
CREATE OR REPLACE PACKAGE BODY pkg_testAS PROCEDURE get (p_id VARCHAR p_str OUT VARCHAR p_rc OUT myrctype) IS sqlstr VARCHAR ( ); BEGIN p_str := Hello may~ ; IF p_id = all THEN OPEN p_rc FOR SELECT * FROM BOOK; ELSE sqlstr := select * from BOOK where BOOKID=:w_id ; OPEN p_rc FOR sqlstr USING p_id; END IF; END get;END pkg_test;
/
在这里我们建立了一个输入参数 为普通类型 两个输出参数 其中一个为普通VARCHAR 型 另一个为特殊的记录集类型
(注 在数据库端测试一下这个过程 以确保没有问题 开始下面的操作~ )
二 编写JAVA代码测试过程
/* * 创建日期: */package JDBC;
/** * 作者:may * 时间: : : */import java sql *;import oracle jdbc driver *;
public class proctest { public static void main(String[] args) { proctest pc = new proctest(); pc ShowContent(); } String sDBDriver= oracle jdbc driver OracleDriver ; String sConnStr= jdbc:oracle:thin:@ : :ORADB ; Connection connect=null; ResultSet rs = null; public proctest(){ try{ Class forName(sDBDriver); } catch(ClassNotFoundException e){ System err println(e getMessage()); } } public ResultSet ShowContent() { try{ connect = DriverManager getConnection(sConnStr SHUIBJ SHUIBJ ); CallableStatement stmt = connect prepareCall( {call PKG_TEST GET(? ? ?)} ); stmt setString( all ); //输入参数 stmt registerOutParameter( Types CHAR); //输出参数为普通参数 stmt registerOutParameter( OracleTypes CURSOR); //输出参数为结果集参数 stmt executeQuery(); rs = ((OracleCallableStatement) stmt) getCursor( ); //得到输出结果集参数 ResultSetMetaData r *** d = rs getMetaData(); int numberOfColumns = r *** d getColumnCount();
String str = stmt getString( ); System out println( 第二个参数为: +str); System out println( 结果集列数 +numberOfColumns); //列出结果集中的记录 ResultSetMetaData md = rs getMetaData(); int nColumns = md getColumnCount(); for (int i= ;i=nColumns;i++){ System out print(md getColumnName(i)+((i==nColumns)? \n : \t )); if(i== ) System out print( \t ); } while (rs next()){ for(int i= ;i=nColumns;i++){ System out print(rs getString(i)+((i==nColumns)? \n : \t )); } } } catch(SQLException ex){ System err println(ex getMessage()+ 连数据库有问题! ); } return rs; } } 输出结果为
lishixinzhi/Article/program/Oracle/201311/18612
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成
1.创建包
--创建一个包sp_package
create package sp_package is
--声明该包有一个过程和函数,(没有实现)
procedure update_sal(name varchar2,newsal number);
function annual_nicome(name varchar2) return number;
end;
--创建包体(用于实现已经声明的函数和过程)
create package body sp_package is
procedure update_sal(name varchar2,newsal number)
is
BEGIN
UPDATE emp
SET sal = newsal
WHERE ename = name;
END;
function annual_income(name varchar2)
return number is
annual_salary number;
BEGIN
SELECT sal * 12 + Nvl(comm,0)
INTO annual_salary
FROM emp
WHERE ename = name;
RETURN annual_salary;
END;
end;
--调用包中的内容
exec sp_package.update_sal('name',number);
包用于在逻辑上组合过程和函数,它由包规范和包体两部分组成
1.创建包
--创建一个包sp_package
create package sp_package is
--声明该包有一个过程和函数,(没有实现)
procedure update_sal(name varchar2,newsal number);
function annual_nicome(name varchar2) return number;
end;
--创建包体(用于实现已经声明的函数和过程)
create package body sp_package is
procedure update_sal(name varchar2,newsal number)
is
BEGIN
UPDATE emp
SET sal = newsal
WHERE ename = name;
END;
function annual_income(name varchar2)
return number is
annual_salary number;
BEGIN
SELECT sal * 12 + Nvl(comm,0)
INTO annual_salary
FROM emp
WHERE ename = name;
RETURN annual_salary;
END;
end;
--调用包中的内容
exec sp_package.update_sal('name',number);