ASP调用Oracle存储过程

合集下载

oracle 存储过程 相互调用 注意事项

oracle 存储过程 相互调用 注意事项

Oracle存储过程相互调用注意事项1. 简介Oracle存储过程是一种存储在数据库中的预编译程序,它能够接收输入参数并执行数据库操作。

在实际应用中,经常会遇到需要一个存储过程调用另一个存储过程的情况。

本文将介绍在Oracle数据库中存储过程相互调用的注意事项,帮助开发人员有效地处理这一问题。

2. 合理设计存储过程在进行存储过程相互调用前,首先需要合理设计存储过程。

每个存储过程应当具有明确的功能和输入输出参数,避免一个存储过程功能过于庞大,造成不易维护和调用。

为了方便相互调用,可以将一些公共逻辑抽象成一个单独的存储过程,方便其他存储过程调用。

3. 考虑存储过程间的依赖关系在进行存储过程相互调用时,需要考虑存储过程之间的依赖关系。

如果存储过程A需要先执行存储过程B,那么在调用存储过程A时,需要先确保存储过程B已经执行。

在设计存储过程时,应该明确存储过程之间的依赖关系,避免出现循环调用或者无法满足依赖关系的情况。

4. 使用事务控制在存储过程相互调用过程中,往往会涉及到对数据库的数据操作。

为了保证数据的一致性和完整性,可以使用事务控制来确保多个存储过程执行的原子性。

在存储过程中使用BEGIN...END语句包裹多个存储过程的调用,然后使用COMMIT或ROLLBACK语句来统一提交或回滚事务。

5. 处理异常情况在存储过程相互调用时,可能会出现各种异常情况,比如存储过程执行失败、参数错误等。

因此在进行存储过程相互调用时,需要考虑如何处理异常情况。

可以使用异常处理语句来捕获异常并做相应的处理,比如记录日志、返回错误信息等。

6. 参数传递和返回值在存储过程相互调用时,需要注意参数的传递和返回值的获取。

确保参数的类型和值能够正确传递到被调用的存储过程中,并能够正确获取被调用存储过程的返回值。

可以使用IN、OUT或者IN OUT参数来传递值,并使用RETURN语句来返回值。

7. 性能优化在进行存储过程相互调用时,需要考虑性能优化的问题。

用ASP.Net(C#)连接Oracle数据库的方法及实例

用ASP.Net(C#)连接Oracle数据库的方法及实例

⽤(C#)连接Oracle数据库的⽅法及实例今天看了⼀下连接oracle数据库的⽅法,得到了如下代码。

这段代码打开了MyTable表,并把操作员的名字列出。

字段类型是OracleString。

读取的时候⽤的是字段编号,我不知道怎么使⽤字段名来读取某字段的内容。

下⾯是代码://⾸先添加两条引⽤using System.Data.OracleClient;using System.Data;//在窗体上添加⼀个按钮,叫Button1,双击Button1,输⼊以下代码private void Button1_Click(object sender, System.EventArgs e){string ConnectionString="Data Source=sky;user=system;password=manager;";//写连接串OracleConnection conn=new OracleConnection(ConnectionString);//创建⼀个新连接try{conn.Open();OracleCommand cmd=conn.CreateCommand();mandText="select * from MyTable";//在这⼉写sql语句OracleDataReader odr=cmd.ExecuteReader();//创建⼀个OracleDateReader对象while(odr.Read())//读取数据,如果odr.Read()返回为false的话,就说明到记录集的尾部了{Response.Write(odr.GetOracleString(1).ToString());//输出字段1,这个数是字段索引,具体怎么使⽤字段名还有待研究}odr.Close();}catch(Exception ee){Response.Write(ee.Message); //如果有错误,输出错误信息}finally{conn.Close(); //关闭连接}}=====================================oracle9i连接⽅法及注意点推荐⽅式public void oledboracle_dataset(){string ConnectionString="Data Source=mine;user=sys;password=sys;"; //写连接串OracleConnection conn=new OracleConnection(ConnectionString); //创建⼀个新连接OracleCommand cmd= new OracleCommand("select * from fjdl.t_rights",conn);DataSet ds = new DataSet();OracleDataAdapter oda=new OracleDataAdapter();oda.SelectCommand=cmd;oda.Fill(ds);conn.Close();DataGrid1.DataSource=ds.Tables[0].DefaultView;DataGrid1.DataBind();}以下为⽤dataset和datareader,oledb和oralceclient的四种⽅法public void oledboracle_datareader(){System.Data.OleDb.OleDbConnection oledb1=new System.Data.OleDb.OleDbConnection();string sqlText="select * from scott.tAdmin";System.Data.OleDb.OleDbDataReader reader;oledb1.ConnectionString="Provider=\"OraOLEDB.Oracle.1\";User ID=system;password=system;Data Source=rick;";System.Data.OleDb.OleDbCommand Com=new System.Data.OleDb.OleDbCommand(sqlText,oledb1);Com.Connection.Open();reader=Com.ExecuteReader();DataGrid1.DataSource=reader;DataGrid1.DataBind();//this.Response.Write(oleDbConnection1.ConnectionString);reader.Close();Com.Connection.Close();}public void oledboracle_dataset(){System.Data.OleDb.OleDbConnection oledb1=new System.Data.OleDb.OleDbConnection("Provider=\"OraOLEDB.Oracle.1\";User ID=system;password=system;Data Source=rick;");string sqlText="select * from scott.tAdmin";System.Data.DataSet set1=new DataSet();System.Data.OleDb.OleDbDataAdapter Ada1=new System.Data.OleDb.OleDbDataAdapter (sqlText,oledb1);Ada1.Fill(set1,"data1");this.DataGrid2.DataSource=set1.Tables["data1"].DefaultView;this.DataGrid2.DataBind();}public void oracle_dataset(){System.Data.OracleClient.OracleConnection oracle1=new System.Data.OracleClient.OracleConnection("user id=system;data source=rick;password=system"); string sqlText="select * from scott.tAdmin";System.Data.DataSet set1=new DataSet();System.Data.OracleClient.OracleDataAdapter Ada1=new System.Data.OracleClient.OracleDataAdapter(sqlText,oracle1);Ada1.Fill(set1,"oracle_data1");this.DataGrid3.DataSource=set1.Tables["oracle_data1"].DefaultView;this.DataGrid3.DataBind();}public void oracle_datareader(){System.Data.OracleClient.OracleConnection oracle2=new System.Data.OracleClient.OracleConnection();string sqlText="select * from scott.tAdmin";System.Data.OracleClient.OracleDataReader reader;oracle2.ConnectionString="User ID=system;user id=system;data source=rick;password=system";System.Data.OracleClient.OracleCommand Com=new System.Data.OracleClient.OracleCommand(sqlText,oracle2);Com.Connection.Open();reader=Com.ExecuteReader();DataGrid4.DataSource=reader;DataGrid4.DataBind();//this.Response.Write(oleDbConnection1.ConnectionString);reader.Close();Com.Connection.Close();}注意点:如果不设置远程数据的本级⽹络配置ORA-00162: external dbid length 18 is greater than maximum (16)连接名称不能超过16个字符修改⽅法Configuration and Migration Tools->Net Configuration Assistant中配置===========================================在.NET中调⽤Oracle9i存储过程经验总结在.NET中调⽤Oracle9i存储过程可以⽤多个数据提供者,⽐如OralceClient,OleDb。

oracle存储过程的用法 -回复

oracle存储过程的用法 -回复

oracle存储过程的用法-回复Oracle存储过程的用法Oracle存储过程是一组预编译的SQL语句和可执行代码的集合,存储在数据库中以供以后反复使用。

它可以在数据库服务器上执行,从而提高性能和减少网络开销。

本文将逐步讨论Oracle存储过程的用法,并深入探讨存储过程的创建、调用和管理。

一、创建存储过程要创建一个Oracle存储过程,可以使用PL/SQL语言。

下面是一个简单的例子:sqlCREATE OR REPLACE PROCEDURE get_employee (p_emp_id IN NUMBER, p_emp_name OUT VARCHAR2)ISBEGINSELECT emp_name INTO p_emp_name FROM employees WHERE emp_id = p_emp_id;END;/在上述代码中,我们定义了一个存储过程名为"get_employee",它有两个参数:一个输入参数p_emp_id和一个输出参数p_emp_name。

存储过程的目的是根据员工ID获取员工姓名。

在存储过程体中,我们使用SELECT语句从"employees"表中检索指定员工ID的姓名,并将结果赋值给输出参数p_emp_name。

二、调用存储过程要调用一个存储过程,可以使用EXECUTE或者CALL语句。

以下是简单的调用存储过程的例子:sqlDECLAREemp_name VARCHAR2(100);BEGINget_employee(1001, emp_name);DBMS_OUTPUT.PUT_LINE('Employee Name: ' emp_name); END;/在上面的代码中,我们首先定义了一个变量"emp_name",它将用于存储存储过程返回的员工姓名。

然后,我们调用了"get_employee"存储过程,并将1001作为员工ID传递给输入参数p_emp_id。

ASP调用存储过程的方法

ASP调用存储过程的方法

ASP调用存储过程的方法大家知道ASP调用存储过程吗?ASP与存储过程(Stored Procedures)的文章不少,但是我怀疑作者们是否真正实践过。

我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那幺回事。

 1 这也是最简单的方法,两个输入参数,无返回值: set connection = server.createob ject(“adodb.connection”) connection.open someDSN Connection.Execute “procname varvalue1, varvalue2” '将所有对象清为nothing,释放资源 connection.close set connection = nothing 2 如果要返回Recordset 集: set connection = server.createob ject(“adodb.connection”) connection.open someDSN set rs = server.createob ject(“adodb.recordset”) rs.Open “Exec procname varvalue1, varvalue2”,connection 将所有对象清为nothing,释放资源 rs.close connection.close set rs = nothing set connection = nothing 3 以上两种方法都不能有返回值,(Recordset除外),如果要得到返回值,需要用Command的方法。

 首先说明,返回值有两种。

一种是在存储过程中直接return一个值,就象C和VB的函数返回值那样;另一种是可以返回多个值,存储这些值的变量名称需要在调用参数中先行指定。

 这个例子要处理多种参数,输入参数,输出参数,返回记录集以及一个直接返回值(够全了吧?) 存储过程如下: use pubs GO -- 建立存储过程 create procedure sp_PubsTest -- 定义三个参数变量,注意第三个,特别标记是用于输出 @au_lname varchar (20), @intID int, @intIDOut int OUTPUT AS SELECT @intIDOut = @intID + 1 SELECT * FROM authors WHERE au_lname LIKE @au_lname + '%' --直接返回一个值 RETURN @intID + 2 相信大家已经了解ASP调用存储过程了吧!。

如何在ASP中访问Oracle

如何在ASP中访问Oracle

如何在ASP中访问Oracle?我一直使用Oracle数据库,现在需要在Web上对Oracle8数据库进行访问,可我发现,在ASP中,ADO对Oracle的访问并不顺利,不但速度慢,而且还不能访问Oracle8的数字型字段(!)请问有什么办法可以实现对它们的顺利访问?我们可以利用Oracle Object for OLE所包含的Oracle Objects Server来实现在ASP中对Oracle 8的访问。

Oracle Objects Server共提供Oraclient、Orasession、Oraconnection、OraDatabase、OraDynaset、OraSQLstmt、OraField、Oraparameter、Oraparameter Array等九个对象供开发者使用。

Oracle Object for OLE是Oracle公司为客户端访问数据库开发的一个软件,运行在Windows95/98/NT平台。

在用Oracle Objects Server访问Oracle8数据库之前,我们必须在Web服务器上安装Oracle Object for OLE,然后利用SQL+Net Client2.X或Oracle Net8 Client8.X进行数据库的连接测试并设置数据库别名。

下面举一个在ASP中利用Oracle Object for OLE2.3查询Oracle 8.0.5数据库,并进行分页显示的程序范例。

需要说明,由于Orasession对象的属性中没有控制分页的属性,本例同时使用了一个分页控制的程序,chunfeng.asp文件先取得数据库表的内容,然后计算分页的页数,如果页数超过一页,则交由chunfeng01.asp处理。

具体代码如下:chunfeng.asp<%set orasession=createobject("oracleinprocserver.xorasession")set oradatabase=orasession.dbopendatabase("orant","scotter/tiger",0)' 连接数据库sql="select * from cq_hjwj "set session(oradynaset)=oradatabase.dbcreatedynaset(sql,0)'设置查询条件pagesize=15' 设置页长if session(oradynaset).recordcount=0 thenresponse.write "对不起,没有找到符合条件的数据!"elseresponse.write"<h3>精彩春风之查询结果</h3>"pages=int(session(oradynaset).recordcount/pagesize)if pages*pagesize=session(oradynaset).recordcount thenpages=int(session(oradynaset).recordcount/pagesize)' 计算页数elsepages=int(session(oradynaset).recordcount/pagesize)+1end ifif request("page")="" thenpage=1elsepage=cstr(request("page"))end ifresponse.write"共"&pages&"页,目前第"&page&"页"response.write"<table border=5><tr>"for i=0 to session(oradynaset).fields.count - 1response.write"<td>"response.write session(oradynaset).fields(i).nameresponse.write"</td>"nextresponse.write "</tr>"startrow=(page-1)*pagesize+1endrow=page*pagesizeoradynaset.moveto startrowfor j=startrow to endrowresponse.write"<tr>"for i=0 to session(oradynaset).fields.count - 1response.write"<td>"response.write session(oradynaset).fields(i).valueresponse.write"</td>"nextresponse.write"</tr>"session(oradynaset).dbmovenextif session(oradynaset).eof then exit fornextresponse.write"</table>"end ifif page>1 thenresponse.write "<a href='chunfeng01.asp?page=1'>第一页</a> " response.write "<a href='chunfeng01.asp?page=" & page-1 & "'>上一页</a> " end ifif cint(page)<pages thenresponse.write "<a href='chunfeng01.asp?page=" & page+1 & "'>下一页</a> " response.write "<a href='chunfeng01.asp?page=" & pages & "'>最后页</a> " end ifset orasession=nothing%><html></html>chunfeng01.asp<%pagesize=15' 设置页长if session(oradynaset).recordcount=0 thenresponse.write "对不起,没有找到符合条件的数据!"elseresponse.write"<h3>精彩春风之查询结果</h3>"pages=int(session(oradynaset).recordcount/pagesize)if pages*pagesize=session(oradynaset).recordcount thenpages=int(session(oradynaset).recordcount/pagesize)' 计算页数elsepages=int(session(oradynaset).recordcount/pagesize)+1end ifif request("page")="" thenpage=1elsepage=cstr(request("page"))end ifresponse.write"共"&pages&"页,目前第"&page&"页"response.write"<table border=5><tr>"for i=0 to session(oradynaset).fields.count - 1response.write"<td>"response.write session(oradynaset).fields(i).nameresponse.write"</td>"nextresponse.write "</tr>"startrow=(page-1)*pagesize+1endrow=page*pagesizeoradynaset.moveto startrowfor j=startrow to endrowresponse.write"<tr>"for i=0 to session(oradynaset).fields.count - 1response.write"<td>"response.write session(oradynaset).fields(i).valueresponse.write"</td>"nextresponse.write"</tr>"session(oradynaset).dbmovenextif session(oradynaset).eof then exit fornextresponse.write"</table>"end ifif page>1 thenresponse.write "<a href='chunfeng01.asp?page=1'>第一页</a> " response.write "<a href='chunfeng01.asp?page=" & page-1 & "'>上一页</a> " end ifif cint(page)<pages thenresponse.write "<a href='chunfeng01.asp?page=" & page+1 & "'>下一页</a> "response.write "<a href='chunfeng01.asp?page=" & pages & "'>最后页</a> " end ifset orasession=nothing%><html></html>。

在ASP中使用Oracle数据库

在ASP中使用Oracle数据库

在ASP中使用Oracle数据库Oracle是世界上用得最多的数据库之一,活动服务器网页(ASP)是一种被广泛用于创建动态网页的功能强大的务器端脚本语言。

许多ASP开发人员一直在考虑,能否在开发互联网应用、电子商务网站、互联网管理系统时结合使用ASP和Oracle数据库?这个问题的答案是肯定的,我们还可以使用VB访问Oracle数据库。

在本篇文章中,我们将主要讨论如何使用ASP来处理Oracle数据库中数据的方法。

在开始讨论这个问题前,我们需要了解几个背景知识,Oracle Objects for OLE就是其中之一。

Oracle Objects for OLE是Oracle开发的一个中间件,它允许使用微软的OLE标准的客户端应用程序访问Oracle的数据库。

也许会有读者说,我们也可以使用ODBC访问Oracle 的数据库。

当然,可以使用ODBC访问Oracle数据库,但我认为,Oracle Objects for OLE比ODBC更安全,而且完全支持PL/SQL。

PL/SQL是Oracle对SQL命令集的扩展,开发人员能够利用它对非结构化的SQL命令块进行流控制和逻辑设计。

如果安装的是Oracle8i数据库,我相信你已经在使用Oracle Objects for OLE。

如果还没有使用Oracle Objects for OLE,可以从Oracle的网站上下载它。

另外,我们还需要了解Oracle针对Visual Basic开发的二个对象和一个接口:OraSession、OraDynaset对象和OraDatabase接口。

OraSession对象管理应用程序的OraDatabase、OraConnection和OraDynaset,它是由ASP的CreateObject而不是Oracle Objects for OLE创建的一个对象。

OraDatabase接口向Oracle数据库表示表现用户对话,并为SQL、PL/SQL的执行提供方法。

asp调用存储过程

asp调用存储过程

存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令通过创建存储过程以及在ASP中调用存储过程,就可以避免将SQL语句同ASP 代码混杂在一起。

这样做的好处至少有三个:第一、大大提高效率。

存储过程本身的执行速度非常快,而且,调用存储过程可以大大减少同数据库的交互次数。

第二、提高安全性。

假如将SQL语句混合在ASP代码中,一旦代码失密,同时也就意味着库结构失密。

第三、有利于SQL语句的重用。

在ASP中,一般通过command对象调用存储过程,根据不同情况,本文也介绍其它调用方法。

为了方便说明,根据存储过程的输入输出,作以下简单分类:1. 只返回单一记录集的存储过程假设有以下存储过程(本文的目的不在于讲述T-SQL语法,所以存储过程只给出代码,不作说明):/*SP1*/CREATE PROCEDURE dbo.getUserListasset nocount onbeginselect * from dbo.[userinfo]endgo以上存储过程取得userinfo表中的所有记录,返回一个记录集。

通过command对象调用该存储过程的ASP代码如下:'**通过Command对象调用存储过程**DIM MyComm,MyRstSet MyComm = Server.CreateObject("mand")MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串mandText = "getUserList" '指定存储过程名mandType = 4 '表明这是一个存储过程 MyComm.Prepared = true '要求将SQL命令先行编译Set MyRst = MyComm.ExecuteSet MyComm = Nothing存储过程取得的记录集赋给MyRst,接下来,可以对MyRst进行操作。

Oracle(存储过程、存储函数、用程序调用)

Oracle(存储过程、存储函数、用程序调用)

Oracle (存储过程、存储函数、⽤程序调⽤)指存储在数据库中的供所有⽤户程序带哦⽤的⼦程序(PL/SQL )叫存储过程(不能返回值)、存储函数(可以通过return 语句返回值)1、存储过程为了完成特定功能的SQL 语句集,经编译后存储在数据库中。

(1)新建:(2)书写存储过程的代码:(3)编译运⾏代码:(4)调⽤存储过程:2、存储函数create or replace procedure raiseSalary(eno in number)ispsal emp.sal %type;beginselect sal into psal from emp where empno=eno;update emp set sal= sal + 100 where empno = eno ;dbms_output.put_line('前:'||psal||'后:'||(psal+100));end raiseSalary;存储函数与存储过程的结构类似,但是必须有⼀个return ⼦句,⽤于返回函数值。

(1)创建⼀个存储函数:(2)书写代码:(3)右键选择test:3、存储过程和存储函数的OUT(1)创建存储过程:(2)书写程序:查询员⼯的信息(3)测试结果:create or replace function queryEmpIncome(eno in number)return numberispsal emp.sal %type;pcomm m %type;beginselect sal,comm into psal,pcomm from emp where empno=eno;return psal*12+nvl(pcomm,0);end queryEmpIncome;create or replace procedure queryEmpInfeno(eno in number,pename out varchar2,psal out number,pjob out varchar2)isbeginselect ename,sal,job into pename,psal,pjob from emp where empno=eno; end queryEmpInfeno;4、java程序调⽤存储过程和存储函数(1)先在虚拟机中找到需要导⼊的jar包并进⾏导⼊:(2)书写⼀个⼯具类:package pers.zhb.utils;import java.sql.*;public class JDBCUtils {private static String driver = "oracle.jdbc.OracleDriver";private static String url = "jdbc:oracle:thin:@192.168.125.129:1521/orcl"; private static String user = "scott";private static String password = "tiger";static{try {Class.forName(driver);} catch (ClassNotFoundException e) {throw new ExceptionInInitializerError(e);}}public static Connection getConnection(){try {return DriverManager.getConnection(url, user, password);} catch (SQLException e) {e.printStackTrace();}return null;}public static void release(Connection conn, Statement st, ResultSet rs){ if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}finally{rs = null;}}if(st != null){try {st.close();} catch (SQLException e) {e.printStackTrace();}finally{st = null;}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}finally{conn = null;}}}}(3)创建测试类,调⽤存储过程和存储函数:public class Test {public void testProcedure(){String sql = "{call raiseSalary(?,?,?,?)}";Connection conn = null;CallableStatement call = null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);call.setInt(1,7839);call.registerOutParameter(2, OracleTypes.VARCHAR); call.registerOutParameter(3, OracleTypes.NUMBER); call.registerOutParameter(4, OracleTypes.VARCHAR); call.execute();String name = call.getString(2);double sal = call.getDouble(3);String job = call.getString(4);System.out.println(name+"\t"+sal+"\t"+job);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}public void testFunction(){String sql = "{?=call queryEmpIncome(?)}";Connection conn = null;CallableStatement call = null;try {conn = JDBCUtils.getConnection();call = conn.prepareCall(sql);call.registerOutParameter(1, OracleTypes.NUMBER); call.setInt(2, 7839);call.execute();double income = call.getDouble(1);System.out.println(income);} catch (Exception e) {e.printStackTrace();}finally{JDBCUtils.release(conn, call, null);}}public static void main(String [] args){Test test=new Test();test.testFunction();}}。

oracle存储过程的创建和使用方法

oracle存储过程的创建和使用方法

oracle存储过程的创建和使用方法Oracle存储过程是一组预编译SQL语句,通过一个名称调用执行。

以下是Oracle存储过程的创建和使用方法:1. 创建存储过程:sqlCopy codeCREATE OR REPLACE PROCEDURE procedure_name (parameter_name1 IN data_type, parameter_name2 OUT data_type, ...) IS -- 声明变量 BEGIN -- SQL语句 EXCEPTION -- 异常处理 END procedure_name;其中,parameter_name1和parameter_name2为存储过程的输入和输出参数。

声明变量和编写SQL语句的代码都应该放在BEGIN和END之间。

2. 调用存储过程:scssCopy codeEXEC procedure_name(parameter_name1, parameter_name2, ...);其中,parameter_name1和parameter_name2是存储过程的输入和输出参数。

使用EXEC语句调用存储过程。

3. 示例:以下是一个简单的Oracle存储过程示例,该存储过程将向一个名为employee的表中插入新的记录:sqlCopy codeCREATE OR REPLACE PROCEDURE insert_employee ( emp_id IN NUMBER, emp_name IN VARCHAR2, emp_salary IN NUMBER,emp_department IN VARCHAR2) IS BEGIN INSERT INTO employee (employee_id, employee_name, employee_salary, employee_department) VALUES (emp_id, emp_name, emp_salary, emp_department); COMMIT; END insert_employee;可以使用以下语句调用该存储过程:arduinoCopy codeEXEC insert_employee(1001, 'John Smith', 5000, 'Sales');这将向employee表中插入一个新的记录,该记录包含员工ID为1001、姓名为John Smith、薪资为5000、部门为销售的信息。

SQL中调用ORACLE存储过程

SQL中调用ORACLE存储过程

SQL中调用ORACLE存储过程在SQL中调用Oracle存储过程是一种常见的操作,可以通过以下步骤实现:1.创建存储过程:首先,在Oracle数据库中创建存储过程。

存储过程是一段预编译的代码块,可以在需要的时候被调用。

它可以接收参数并执行一系列的SQL语句。

例如,我们创建一个简单的存储过程,命名为"GET_EMPLOYEE",该存储过程接收一个参数"EMPLOYEE_ID",根据该参数查询并返回员工的信息。

```sqlCREATEORREPLACEPROCEDUREGET_EMPLOYEEEMPLOYEE_IDINNUMBER,EMPLOYEE_NAMEOUTVARCHAR2,EMPLOYEE_DEPARTMENTOUTVARCHAR2,EMPLOYEE_SALARYOUTNUMBERABEGINSELECTNAME,DEPARTMENT,SALARYINTOEMPLOYEE_NAME,EMPLOYEE_DEPARTMENT,EMPLOYEE_SALARYFROMEMPLOYEESWHEREID=EMPLOYEE_ID;END;/```上述代码中,我们定义了一个存储过程"GET_EMPLOYEE",它接收一个参数"EMPLOYEE_ID",以及三个输出参数"EMPLOYEE_NAME"、"EMPLOYEE_DEPARTMENT"和"EMPLOYEE_SALARY"。

在存储过程中,我们使用"SELECTINTO"语句将查询结果赋值给输出参数。

2.调用存储过程:一旦存储过程创建成功,就可以通过SQL语句来调用它。

```sqlDECLAREEMP_NAMEVARCHAR2(50);EMP_DEPTVARCHAR2(50);EMP_SALNUMBER;BEGINGET_EMPLOYEE(1001,EMP_NAME,EMP_DEPT,EMP_SAL);--执行后,EMP_NAME、EMP_DEPT和EMP_SAL将分别包含员工1001的姓名、部门和薪水信息END;/```在上述代码中,我们使用DECLARE块定义了三个变量"EMP_NAME"、"EMP_DEPT"和"EMP_SAL",这些变量分别用来存储存储过程的输出参数。

2020年(Oracle管理)简介使用ASPNET访问Oracle数据库的方法

2020年(Oracle管理)简介使用ASPNET访问Oracle数据库的方法

(Oracle管理)简介使用ASPNET访问Oracle数据库的方法简介使用访问Oracle数据库的方法摘要本文简要介绍了使用访问Oracle数据库的方法。

首先,介绍了组件的安装;其次,简单说明了System.Data.OracleClient中包含的核心类;最后,通过一个实例讲解了具体的使用方法。

目录•引言•系统需求和安装•核心类介绍•举例说明•参考信息引言FrameworkDataProviderforOracle(以下简称为.NETforOracle)是一个.NETFramework 的组件。

这个组件为我们使用.NET访问Oracle数据库提供了极大的方便。

那些使用.NET和Oracle的开发人员,相信会乐的手舞足蹈,因为他们再也不必使用那个并不十分“专业="的OLEDB来访问Oracle数据库了。

这个组件的设计非常类似.NET中内置的FrameworkDataProviderforSQLServer和OLEDB。

如果读者非常熟悉这两个内置的组件,那么相信您学习这个组件也是轻车熟路的。

本文针对的读者主要是那些考虑使用.NET技术访问Oracle数据库的程序员而编写,需要有一定的C#语言、技术和Oracle数据库基础知识。

文中结合技术给出了相关示例以及具体的注释。

当然,这并不意味着.NETforOracle组件只能为编写程序提供服务,同样它还可以为使用.NET技术编写的Windows程序提供方便。

本文将简要介绍forOracle的系统需求和安装以及核心类,之后重点详解使用此组件访问Oracle 数据库的方法。

其中包括.NETforOracle对于各种Oracle数据库中的特殊数据类型的访问、各种核心类使用方法的介绍并且在文章的最后给出了示例等等。

系统需求和安装在安装.NETforOracle之前,必须首先安装.NETFrameworkversion1.0。

同时,还要确定安装了数据访问组件(MDAC2.6及其以上版本,推荐版本是2.7)。

JAVA调用ORACLE存储过程小结

JAVA调用ORACLE存储过程小结

JAVA调用ORACLE存储过程小结在Java中调用Oracle存储过程是一个常见的需求,本文将给出一个关于如何在Java中调用Oracle存储过程的小结。

主要包括以下方面内容:1. 连接到Oracle数据库:首先需要使用Java的JDBC API来连接到Oracle数据库。

可以使用Oracle提供的JDBC驱动程序,通过加载驱动程序的方式来建立与数据库的连接。

在连接数据库时,需要提供数据库的URL、用户名和密码。

2. 构造存储过程的调用语句:在Java中调用Oracle存储过程时,需要构造一个适当的SQL语句来调用存储过程。

调用语句的格式为“{call 存储过程名(参数1, 参数2, ...)}”。

3. 设置存储过程的输入参数:在构造存储过程的调用语句后,需要通过PreparedStatement对象设置存储过程的输入参数。

这可以通过调用PreparedStatement对象的setXXX(方法来实现,其中XXX是参数的数据类型。

例如,如果输入参数是整数类型,则可以调用setInt(方法设置参数的值。

4. 执行存储过程:设置好存储过程的输入参数后,可以通过调用PreparedStatement对象的executeUpdate(或execute(方法来执行存储过程。

executeUpdate(方法适用于执行插入、更新或删除操作的存储过程,而execute(方法适用于执行查询操作的存储过程。

5. 获取存储过程的输出参数:执行存储过程后,可以通过PreparedStatement对象的getXXX(方法来获取存储过程的输出参数的值。

需要注意的是,存储过程的输出参数必须在执行存储过程之前通过调用registerOutParameter(方法来注册。

6. 关闭连接和释放资源:执行完存储过程后,需要关闭与数据库的连接,并释放相关的资源。

可以通过调用Connection对象的close(方法来关闭连接。

下面是一个示例代码,展示了如何在Java中调用Oracle存储过程:```javaimport java.sql.*;public class CallOracleProcedurepublic static void main(String[] args)Connection conn = null;CallableStatement stmt = null;try// 连接到Oracle数据库Class.forName("oracle.jdbc.driver.OracleDriver");//构造存储过程的调用语句String sql = "{call PROCEDURE_NAME(?, ?, ?)}";stmt = conn.prepareCall(sql);//设置存储过程的输入参数stmt.setString(1, "input1");stmt.setInt(2, 10);//注册存储过程的输出参数stmt.registerOutParameter(3, Types.VARCHAR);//执行存储过程stmt.executeUpdate(;//获取存储过程的输出参数String output = stmt.getString(3);System.out.println("Output: " + output);} catch (SQLException , ClassNotFoundException e) e.printStackTrace(;} finally//关闭连接和释放资源tryif (stmt != null) stmt.close(;if (conn != null) conn.close(;} catch (SQLException e)e.printStackTrace(;}}}```上述示例代码展示了如何通过Java程序调用Oracle存储过程。

简介使用ASPNET访问Oracle数据库的方法

简介使用ASPNET访问Oracle数据库的方法

简介使用访问Oracle数据库的方法摘要本文简要介绍了使用访问Oracle数据库的方法。

首先,介绍了组件的安装;其次,简单说明了System.Data.OracleClient中包含的核心类;最后,通过一个实例讲解了具体的使用方法。

目录∙引言∙系统需求和安装∙核心类介绍∙举例说明∙参考信息引言Microsoft .NET Framework Data Provider for Oracle(以下简称为.NET for Oracle)是一个.NET Framework的组件。

这个组件为我们使用.NET访问Oracle数据库提供了极大的方便。

那些使用.NET 和Oracle的开发人员,相信会乐的手舞足蹈,因为他们再也不必使用那个并不十分“专业="的OLEDB来访问Oracle数据库了。

这个组件的设计非常类似.NET中内置的Microsoft .NET Framework Data Provider for SQL Server和OLEDB。

如果读者非常熟悉这两个内置的组件,那么相信您学习这个组件也是轻车熟路的。

本文针对的读者主要是那些考虑使用.NET技术访问Oracle数据库的程序员而编写,需要有一定的C#语言、技术和Oracle数据库基础知识。

文中结合技术给出了相关示例以及具体的注释。

当然,这并不意味着.NET for Oracle组件只能为编写程序提供服务,同样它还可以为使用.NET 技术编写的Windows程序提供方便。

本文将简要介绍 for Oracle的系统需求和安装以及核心类,之后重点详解使用此组件访问Oracle数据库的方法。

其中包括.NET for Oracle对于各种Oracle数据库中的特殊数据类型的访问、各种核心类使用方法的介绍并且在文章的最后给出了示例等等。

系统需求和安装在安装.NET for Oracle之前,必须首先安装.NET Framework version 1.0。

ASP调用存储过程详解

ASP调用存储过程详解

ASP调用存储过程详解ASP调用存储过程是一种常用的数据库操作方式。

存储过程是在数据库服务器上预先编译和存储的一组SQL语句,可以接受输入参数,执行一系列操作,并返回结果。

通过在ASP中调用存储过程,可以有效地提高数据库操作的效率和安全性。

下面将详细介绍ASP调用存储过程的步骤和注意事项。

一、创建存储过程在数据库服务器上创建存储过程是调用存储过程的前提。

创建存储过程通常可以使用SQL Server Management Studio等数据库管理工具。

下面是一个简单的创建存储过程的示例:```CREATE PROCEDURE GetUserInfoASBEGINEND```二、在ASP中调用存储过程下面是一个示例代码,演示了如何在ASP中调用存储过程:```<%Dim connstr, conn, cmd, rs'创建与数据库的连接connstr = "[数据库连接字符串]"Set conn = Server.CreateObject("ADODB.Connection") conn.Open connstrcmd.ActiveConnection = conn'设置输入参数'执行存储过程Set rs = cmd.Execute'处理返回结果While Not rs.EOF'输出结果Response.Write rs("UserName") & "<br>"rs.MoveNextWend'关闭数据库连接rs.CloseSet rs = Nothingconn.CloseSet conn = Nothing%>```三、注意事项在使用ASP调用存储过程时,需要注意以下几点:1. 数据库连接需要及时关闭,可以通过调用Close方法来关闭数据库连接对象。

Springboot调用Oracle存储过程的两种方式及完整代码

Springboot调用Oracle存储过程的两种方式及完整代码

Springboot调⽤Oracle存储过程的两种⽅式及完整代码前⾔因⼯作需要将公司SSH项⽬改为Spingboot项⽬,将项⽬中部分需要调⽤存储过程的部分⽤entityManagerFactory.unwrap(SessionFactory.class).openSession()来获取Session实现后发现项⽬访问数据库超过⼗次就会挂掉,原因是Springboot连接池数量默认为10,猜测是每次访问数据库后连接未释放导致的,⼿动关闭session后问题解决。

解决问题的过程中⼜发现了另外两种调⽤⽅式:直接⽤EntityManager的createStoredProcedureQuery()⽅法调⽤(推荐)通过如下⽅式获取Session来调⽤,这种⽅式不需要⼿动关闭Session来释放连接,具体原因我也没搞明⽩,有知道的朋友欢迎指点Session session = entityManager.unwrap(Session.class);完整代码package com.hzjd.produre.repository;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.ParameterMode;import javax.persistence.PersistenceContext;import javax.persistence.StoredProcedureQuery;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.procedure.ProcedureCall;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import com.hzjd.produre.bean.QueryResponse;import com.hzjd.produre.utils.Assistant;@Repositorypublic class ProdureDAO {public final static String PUBLIC_PAG_SYS_GETNEXTID = "PUBLIC_PAG.SYS_GETNEXTID";public final static String PSBC_QUERYBILL = "PSBCPAY.QUERYBILL";@PersistenceContextEntityManager entityManager;@AutowiredEntityManagerFactory entityManagerFactory;public Session getSession() {return entityManagerFactory.unwrap(SessionFactory.class).openSession();}/*** 使⽤entityManager调⽤存储过程** @param pay_ID* @return*/public QueryResponse queryBill1(String pay_ID) throws Exception {QueryResponse queryResponse = new QueryResponse();StoredProcedureQuery call = entityManager.createStoredProcedureQuery(PSBC_QUERYBILL);call.registerStoredProcedureParameter(1, String.class, ParameterMode.IN).setParameter(1, pay_ID);call.registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(3, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(4, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(5, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(6, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(7, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(8, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(9, String.class, ParameterMode.OUT);call.registerStoredProcedureParameter(10, String.class, ParameterMode.OUT);call.execute();queryResponse.getBody().setPAY_ID(pay_ID);queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputParameterValue(2)));queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputParameterValue(3)));queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(5)));queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(6)));queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputParameterValue(8)));int errorcode = Assistant.nullToInt(call.getOutputParameterValue(9));String errormsg = Assistant.nullToEmpty(call.getOutputParameterValue(10));if (errorcode == 0) {return queryResponse;} else {throw new Exception(errormsg);}}/*** 使⽤sessionFactory开启Session调⽤存储过程** @param pay_ID* @return*/public QueryResponse queryBill2(String pay_ID) throws Exception {QueryResponse queryResponse = new QueryResponse();// 调⽤完成后需关闭Session否则会出现连接失效try (Session session = getSession();) {ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);call.registerParameter(2, String.class, ParameterMode.OUT);call.registerParameter(3, String.class, ParameterMode.OUT);call.registerParameter(4, String.class, ParameterMode.OUT);call.registerParameter(5, String.class, ParameterMode.OUT);call.registerParameter(6, String.class, ParameterMode.OUT);call.registerParameter(7, String.class, ParameterMode.OUT);call.registerParameter(8, String.class, ParameterMode.OUT);call.registerParameter(9, String.class, ParameterMode.OUT);call.registerParameter(10, String.class, ParameterMode.OUT);queryResponse.getBody().setPAY_ID(pay_ID);queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2))); queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3))); queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5))); queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6))); queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));if (errorcode == 0) {return queryResponse;} else {throw new Exception(errormsg);}}}/*** 使⽤sessionFactory开启Session调⽤存储过程** @param pay_ID* @return*/public QueryResponse queryBill3(String pay_ID) throws Exception {QueryResponse queryResponse = new QueryResponse();Session session = entityManager.unwrap(Session.class);ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);call.registerParameter(2, String.class, ParameterMode.OUT);call.registerParameter(3, String.class, ParameterMode.OUT);call.registerParameter(4, String.class, ParameterMode.OUT);call.registerParameter(5, String.class, ParameterMode.OUT);call.registerParameter(6, String.class, ParameterMode.OUT);call.registerParameter(7, String.class, ParameterMode.OUT);call.registerParameter(8, String.class, ParameterMode.OUT);call.registerParameter(9, String.class, ParameterMode.OUT);call.registerParameter(10, String.class, ParameterMode.OUT);queryResponse.getBody().setPAY_ID(pay_ID);queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2))); queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3))); queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5))); queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6))); queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));if (errorcode == 0) {return queryResponse;} else {throw new Exception(errormsg);}}}总结到此这篇关于Spring boot调⽤Oracle存储过程的两种⽅式及完整代码的⽂章就介绍到这了,更多相关Springboot调⽤Oracle存储过程内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

如何调用Oracle存储过程?

如何调用Oracle存储过程?

如何调用Oracle存储过程?请问如何在ASP中使用ADO调用Oracle的存储过程?我们可以在下面的代码里使用微软Oracle 的OLE DB Provider ,包括说明:<%@ LANGUAGE="VBSCRIPT" %><%adCmdUnknown = 0adCmdText = 1adCmdTable = 2adCmdText = 1adParamInput = 1adParamOutput = 2adInteger = 3adUseClient = 3adOpenStatic = 3' 常量Dim cnnOracleDim cmdStoredProcDim rsEmpSet cnnOracle = Server.CreateObject("ADODB.Connection")cnnOracle.CursorLocation = adUseClient' 创建连接对象'strConn = "DSN=OracleDSN; UID=UserID; PWD=Password"' 系统DSN连接strConn = "DRIVER={Microsoft ODBC for Oracle}; SERVER=DatabaseAlias; UID=UserID; PWD=Password"' DSN-less 连接,DatabaseAlias是在SQL*Net Easy Configuration 或Net8里创建的名字'strConn = "Provider=MSDAORA.1; Data Source=DatabaseAlias; User ID=UserID; Password=Password"' OLE DB 连接cnnOracle.Open strConnSet cmdStoredProc = Server.CreateObject("mand")Set cmdStoredProc.ActiveConnection = cnnOracle' 创建一个命令对象'mandText = "{call packperson.oneperson(?,{resultset 2, ssn, fname, lname})}"'mandType = adCmdText'cmdStoredProc.Parameters.Append cmdStoredProc.CreateParameter("wildcard",adInteger, adParamInput)' 只检索一条记录mandText = "{call packperson.allperson({resultset 9, ssn, fname, lname})}"mandType = adCmdText' 检索所有记录Set rsEmp = Server.CreateObject("ADODB.Recordset")rsEmp.CursorType = adOpenStatic' 创建记录集对象Set rsEmp.Source = cmdStoredProc'cmdStoredProc(0) = 555662222' 为只获取一条记录设置参数rsEmp.Open%><HTML><HEAD><META NAME="GENERA TOR" Content="Microsoft Visual InterDev 6.0"><META HTTP-EQUIV="Content-Type" content="text/html; charset=iso-8859-1"><TITLE>精彩春风之调用Oracle存储过程</TITLE></HEAD><BODY><%While Not rsEmp.EOFResponse.Write(rsEmp(0) & "&#xa0;" & rsEmp(1) & " " & rsEmp(2) & "<BR>")rsEmp.MoveNext' 遍历记录集并显示数据WendrsEmp.ClosecnnOracle.Close' 关闭记录集和连接Set cmdStoredProc = nothingSet rsEmp = nothingSet cnnOracle = nothing%></BODY></HTML>。

Oracle存储过程及调用

Oracle存储过程及调用

Oracle存储过程及调⽤Oracle存储过程语法Oracle的存储过程语法如下:create procedure 存储过程名称(随便取)is在这⾥可以定义常量、变量、游标、复杂数据类型这⾥可以定义变量、常量begin执⾏部分end;(2)带参数的存储过程语法:create procedure 存储过程名称(随便取) (变量1 数据类型,变量2 数据类型,...,变量n 数据类型)is在这⾥可以定义常量、变量、游标、复杂数据类型这⾥可以定义变量、常量begin执⾏部分end;(3)带输⼊、输出参数的存储过程语法:create procedure 存储过程名称(随便取) (变量1 in(或out) 数据类型,变量2 in(或out) 数据类型,...,变量n in(或out) 数据类型)is在这⾥可以定义常量、变量、游标、复杂数据类型这⾥可以定义变量、常量begin执⾏部分end;注意:⽤上⾯的语法创建存储过程时可能会碰到数据库中已经有了同名的存储过程,这样Oracle就会弹框报错,说名字已被现有对象使⽤。

解决⽅法有两种: ⽅法⼀:换个存储过程名 ⽅法⼆:在最开头的create procedure 之间加上 or replace 关键字,例如:create or replace procedure 存储过程名称。

但是这种⽅法不建议使⽤,因为这种⽅法会把之前同名的存储过程替换为你当前写的这个存储过程案例⼀:没参数的存储过程create replace procedure procedure_1isbegindbms_output.put_line('procedure_1.......');end;存储过程案例⼆:带参数的的存储过程create procedure procedure_2(v_i number,v_j number)isv_m number(5);begindbms_output.put_line('procedure_2.......');v_m := v_i + v_j;dbms_output.put_line(v_i||' + '||v_j||' = '||v_m);end;存储过程案例三:带输⼊、输出参数的存储过程存储过程的参数分为输⼊参数和输出参数,输⼊参数:输⼊参数⼀般会在变量名和数据类型之间加in来表⽰该参数是输⼊参数输出参数:输出参数⼀般会在变量名和数据类型之间加out来表⽰该变量是输出参数不写in和out的话,默认为输⼊参数create procedure procedure_3(v_i in number,v_j in number ,v_m out number)isbegindbms_output.put_line('procedure_3.......');v_m:=v_i - v_j;dbms_output.put_line(v_i||' - '||v_j||' = '||v_m);end;PL/SQL块中调⽤存储过程下⾯以调⽤上⾯三个存储过程为例declarev_param1 number(5):=2;v_param2 number(5):=8;v_result number(5);begin--调⽤上⾯案例⼀的存储过程procedure_1();--调⽤上⾯案例⼆的存储过程procedure_2(v_param1,v_param2);--调⽤上⾯案例三的存储过程procedure_3(v_param1,v_param2,v_result);dbms_output.put_line(v_result);end;/*执⾏结果:*/procedure_1.......procedure_2.......2 + 8 = 10procedure_3.......2 - 8 = -610java调⽤存储过程案例⼀:java调⽤没有返回值的存储过程要求:编写⼀个像数据库emp表插⼊⼀条编号为6666,姓名为张三,职位为MANAGER的记录/*存储过程*/create procedure procedure_4(v_empno emp.empno%type,v_ename emp.ename%type,v_job emp.job%type )isbegininsert into emp (empno,ename,job) values (v_empno,v_ename,v_job);end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;//java调⽤存储过程try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott", "tiger");cs=conn.prepareCall("{call procedure_4(?,?,?)}");//给输⼊参数赋值cs.setInt(1, 6666);cs.setString(2, "张三");cs.setString(3, "MANAGER");cs.execute();//执⾏} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}//执⾏后就会向数据库的emp表中插⼊⼀条编号为6666,姓名为张三,职位为MANAGER的记录案例⼆:java调⽤返回单列单⾏的存储过程要求:编写⼀个根据员⼯编号查找员⼯姓名的存储过程,并⽤java调⽤该存储过程/*存储过程*/create procedure procedure_5(v_empno in emp.empno%type,v_ename out emp.ename%type)isbeginselect ename into v_ename from emp where empno=v_empno;end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");cs=conn.prepareCall("{call procedure_5(?,?)}");cs.setInt(1, 6666);//给输⼊参数赋值/*指定输出参数的数据类型语法:oracle.jdbc.OracleTypes.输出参数的数据类型此例输出参数的数据类型是varchar,所以是oracle.jdbc.OracleTypes.VARCHAR*/cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);cs.execute();//执⾏//获取输出参数的值,位置要和输出参数对应?的位置对应起来,该例输出参数对应第2个问号,⽽且输出参数的数据类型为字符型,所以是cs.getString(2) String a=cs.getString(2);System.out.println("员⼯姓名:"+a);} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}/*执⾏结果,控制台打印:*/结果:员⼯姓名:张三案例三:java调⽤返回单⾏多列的存储过程要求:编写⼀个根据员⼯编号查找员⼯姓名、职位和⼯资的存储过程,并⽤java调⽤该存储过程/*存储过程*/create procedure procedure_6(v_empno in emp.empno%type,v_ename out emp.ename%type,v_job out emp.job%type,v_sal out emp.sal%type)isbeginselect ename,job,sal into v_ename,v_job,v_sal from emp where empno=v_empno;end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");cs=conn.prepareCall("{call procedure_6(?,?,?,?)}");cs.setInt(1, 7788);//指定输出参数的数据类型,注意:顺序要对应起来cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);cs.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);cs.registerOutParameter(4, oracle.jdbc.OracleTypes.DOUBLE);cs.execute();//执⾏//获取返回值String ename=cs.getString(2);//获取姓名String job=cs.getString(3);//获取职位double sal=cs.getDouble(4);//获取薪⽔System.out.println("员⼯编号为7788的姓名为:"+ename+" 职位是:"+job+" 薪⽔是:"+sal);} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}/*执⾏结果,控制台打印:*/员⼯编号为7788的姓名为:SCOTT 职位是:ANALYST 薪⽔是:3000.0案例四:java调⽤返回多⾏多列(返回列表)的存储过程要求:编写⼀个根据部门编号查找部门所有员⼯信息的存储过程,并⽤java调⽤该存储过程/*定义游标*/create package my_package astype emp_cursor is ref cursor;end my_package;/*存储过程*/create procedure procedure_7(v_deptno in emp.deptno%type,emp_cursor out my_package.emp_cursor)isbeginopen emp_cursor for select * from emp where deptno=v_deptno;end;//java调⽤存储过程public static void main(String[] args) {Connection conn=null;CallableStatement cs=null;ResultSet rs=null;try {Class.forName("oracle.jdbc.OracleDriver");conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl", "scott","tiger");cs=conn.prepareCall("{call procedure_7(?,?)}");cs.setInt(1, 20);//给输⼊参数赋值cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR );//指定输出参数的数据类型cs.execute();rs=(ResultSet) cs.getObject(2);//获取输出参数的值while(rs.next()){//顺序为数据库中字段前后顺序,例如数据库emp表中第5列为hiredate,数据类型为Date,所以获取第5列值时就应该⽤rs.getDate(5) System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getDate(5));}} catch (Exception e) {e.printStackTrace();}finally{closeResource(conn,cs,rs);//关闭资源}}/*以下就是20号部门所有员⼯的信息,这⾥为⽅便我们只打印了编号、姓名和⼊职时间运⾏结果,控制台打印:*/7369 SMITH 1980-12-177566 JONES 1981-04-027788 SCOTT 1987-04-197876 ADAMS 1987-05-237902 FORD 1981-12-03这是上⾯java调⽤存储过程代码中关闭资源⽅法的代码public static void closeResource(Connection conn,CallableStatement cs,ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(cs!=null){try {cs.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}最后给个应⽤,分页的存储过程分页存储过程:/*定义游标*/create package page_package astype page_cursor is ref cursor;end page_package;/*存储过程*/create procedure pro_paging (v_page_size in number,--每页显⽰多少条v_page_count out number,--总页数v_current_page in number,--当前页v_total_count out number,--记录总条数emp_cursor out page_package.page_cursor--返回查询结果集的游标)isv_begin number(5):=v_page_size*(v_current_page-1)+1;--查询起始位置v_end number(5):=v_page_size*v_current_page;--查询结束位置v_sql varchar2(1000):='select empno,ename from(select a.empno,a.ename,rownum rn from(select empno,ename from emp) awhere rownum<='|| v_end ||') bwhere b.rn>='||v_begin;/*不能像下⾯这么写,不然调⽤该存储过程时会报类型不⼀致的错,因为最⾥⾯查的只有empno,ename,因此外⾯也要和⾥⾯保持⼀致 v_sql varchar2(1000):=\'select * from(select a.*,rownum rn from(select empno,ename from emp) awhere rownum<=\'|| v_end ||\') bwhere b.rn>='||v_begin;*/v_ename varchar2(10);v_empno number(4);beginopen emp_cursor for v_sql;loopfetch emp_cursor into v_empno,v_ename;exit when emp_cursor%notfound;dbms_output.put_line(v_empno||' '||v_ename);end loop;v_sql:='select count(empno) from emp';execute immediate v_sql into v_total_count;if(mod(v_total_count,v_page_size)=0) thenv_page_count:=v_total_count/v_page_size;elsev_page_count:=trunc(v_total_count/v_page_size)+1;end if;dbms_output.put_line('共 '||v_total_count||' 条记录');dbms_output.put_line('共 '||v_page_count||' 页');dbms_output.put_line('当前页: '||v_current_page);dbms_output.put_line('每页显⽰ '||v_page_size||' 条');end;Java调⽤的话和上⾯java调⽤存储过程的例⼦⼀样。

oracle存储过程调用实践

oracle存储过程调用实践

一直以来,存储过程就是一个心病啊,都不知道到底什么东西。

不过幸好在别人的带领下,战胜了这个恐惧,算是小小的入门了。

(oracle的sql叫做pl-sql,在语法上和m-sql有一些不同的地方。

而且,由于java和Oracle的密切关系,所以oracle较高版本的pl-sql中也出现一些类似于面向对象编程的语法结构。

)现在把我遇到的各种错误列出来,当然我有log,要不然我都记不住了。

1.ORA-00921: unexpected end of SQL command基本sql错误2.bad SQL grammar基本sql错误3.wrong number or types of arguments in call to ***调用存储过程传入的参数不对4.weblogic.jdbc.wrapper.Array_oracle_sql_ARRAY 使用的是weblogic容器提供的ARRAY,不能直接转化成ORACLE的ARRAY,但是可以用java.sql下面的接口。

5. identifier *** must be declared 数据库中没有定义这个名字的存储过程6.ORA-03115: unsupported network datatype or representation 存储过程传入的参数类型不支持在pl-sql中有package,可以用来定义访问变量的自定义类型,但是返回的类型除了游标以外,都不能被外部,如jdbc来访问。

都会提示类型不知道的错误,不管你有没有加上表空间的名字。

而这个时候需要用全局的类型来定义。

全局的类型,主要分为三种:1.create or replacetype obj_1 as object (** number, ** number,** varchar2(36), ** varchar2(150));2.create or replacetype tab_1 as table of obj_1;3.create or replacetype array_1AS VARRAY(21) OF obj_1;这几种类型都可以作为返回值,而且,后两种类型,常常可以以多维数组的形式返回。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、ASP动态网站开发技术随着人们对因特网认识的加深和IT技术的发展,一成不变的静态网页已经越来越满足不了信息交互和电子商务的需求,因此以数据库为核心开发能够实现信息交互和个性化服务的网页已经成为一种潮流。

为了迎合动态交互式网页的开发趋势,出现了可以与后台数据库进行互动的Web开发技术,目前比较流行的一类是建立在微软Windows平台IIS基础上的ASP(Active Server Pages)技术。

它是将VBscript、JavaScript 等特定的脚本语言利用特殊的标记嵌入到HTML中,当Browser端提出请求时,Web服务器会使用相应的脚本解释引擎对脚本解释执行,完成数据库的查询、修改等任务,并把结果动态格式化成HTML形式送回到Browser请求端。

Oracle数据库是目前国内外最常使用的数据库,随着Oracle 8i的发布,它又增添了对Java和对象的支持,大大方便了网络软件的开发。

因此目前ASP应用程序的开发在很多场合需要与后台Oracle数据库打交道。

下面,我们将以多个专题讨论组的应用为例,着重介绍ASP脚本是如何利用ADO组件的Command对象访问数据库的存储过程的。

多专题讨论组用户提交的信息都统一存储在以下结构的数据库表中:CREATE TABLE messages( m_id NUMBER, m_forumName varchar2(30) NOT NULL, m_subject varchar2(30) NOT NULL, m_username varchar2(30) NOT NULL, m_email varchar2(70) NOT NULL, m_entrydate date default sysdate, m_message varchar2(200), m_ordernum number, m_reply number);其中各字段的含义如下:m_id:每条消息唯一识别的标识号;m_forumname:讨论专题名称;m_subject:消息主题;m_username:用户名;m_email:E-mail地址;m_entrydate:提交时间;m_message:消息内容;m_ordernum:顺序号;m_reply:是否为回答消息。

二、ASP脚本调用Oracle数据库包中的存储过程 1.建立数据库包假设现在数据库表中已经存有多个专题讨论的消息,如果想要在网页上分别显示各专题的名称及各专题的消息数目,首先在Oracle数据库中定义一个名为getForum的存储过程,放在名为forum_retrieve 的包中。

如果存储过程返回的结果是多行数据集,此过程必须放在一个包中。

包是Oracle 数据库的一种对象,它可以将数据类型、存储过程、函数、变量和常量封装在一起,类似于VB中的标准代码模块。

包在结构上又分为包头和包体两部分分别存储的,因此这两部分也要分别建立,包头用来定义可被外部引用的元素;包体定义实际代码,即逻辑执行部分。

此例的包头与包体分别定义如下:CREATE OR REPLACE PACKAGE forum_retrieve AS TYPE tforumname IS TABLE of messages.m_forumname %TYPE INDEX BY BINARY_INTEGER; TYPE tcount IS TABLE of NUMBER INDEX BY BINARY_INTEGER; PROCEDURE getForums ( forumname OUT tforumname, theCount OUT tcount ); 以上是包头的定义,首先对tforumname和tcount这两个PL/SQL表类型进行声明,然后对外部调用到的存储过程进行声明。

CREATE OR REPLACE PACKAGE BODY forum_retrieve AS PROCEDURE getForums ( forumname OUT tforumname, theCount OUT tcount ) AS CURSOR c1 IS SELECT m_forumname FROM messages GROUP by m_forumname ORDER by m_forumname; counter NUMBER DEFAULT 1; BEGIN FOR c IN c1 LOOP forumname(counter):=c.m_forumname; SELECT COUNT(*) into thecount(counter) FROM messages WHERE m_forumname=forumname(counter); counter :=counter+1; END LOOP; END; 以上是对包体的定义,它只包含了一个名为getforums的存储过程。

由于Oracle与sql server等其他数据库不同,不能在存储过程中将查询的多行结果直接返回到调用端,每次只能直接返回一行结果,但在这里我们查询的讨论组名称和数目返回的是多行数据,因此我们使用了PL/SQL的光标c1,它首先查询到不同专题名称的结果集,然后建立游标循环分别对每一个讨论组专题统计出各自的消息数目,将专题名称和消息数目分别存到名为forumname和thecount的PL/SQL表变量中,并作为输出变量返回到调用端。

tforumname和tcount是PL/SQL的两个表类型,这种类型类似于其他编程语言的数组,它们
的定义在存储过程中是无法进行的,因此这也是必须将getforums存储过程放在一个包中的原因。

如果以上forum_retrieve包在创建过程没有出现错误,那么它就已经被编译后存储在Oracle的数据字典中了,在SQL*plus下键入以下命令:SELECT * FROM user_objects WHERE object_name='forum_retrieve'; 会看到名为forum_retrieve的包头和包体的状态,正常应是VALID状态。

2.在ASP文件中调用存储过程下一步我们就可以在客户端的ASP文件中使用ADO Command对象来调用这个存储过程了。

首先在IIS所在主机上要建立好对Oracle数据库ODBC的DSN连接,或直接在ASP文件中建立DSN-Less连接,这完全可以根据个人喜好和具体情况来选择,代码如下:在以上例子中存储过程只有输出变量。

如果被调用的存储过程还包含输入变量,SQL连接字符串应修改如下:SQLstr={call package.procedure(?,..,{resultset 100,output1,output2,...})}其中?是每个输入变量的占位符,与输入变量的个数一一对应。

另外,还要分别对每个输入变量赋值,格式如下:CMD.Parameters.Append CMD.CreateParameter(输入变量名,adVarChar,adParamInput,30,赋值变量) 其中adVarChar指定变量类型是字符串;adParamInput指定变量为输入变量;30是指定字符串的最大长度,如果输入变量是整型或其他类型,则无须设置此项。

所有这些常量的定义都包含在ADOVBS.INC文件中,对于不同的参数类型可查看此文件进行设置。

三、ASP脚本调用Oracle数据库中独立的存储过程所谓独立的存储过程是指没有放在包中,而是作为单独的对象存储在Oracle数据字典中的过程,ASP脚本对这种存储过程的调用与上述方法略有不同,以下举例说明。

例如,要在ASP 脚本中调用独立的名为getmessages的存储过程,代码如下:CREATE OR REPLACE PROCEDURE getmessages(forumname IN messages.m_forumname%TYPE, lastmessage OUT messages.m_id%TYPE)AS BEGIN......‘内容省略ENDgetmessages; 在ASP文件中也是使用ADO Command对象对此过程进行调用,代码如下:四、为什么要使用存储过程 1.存储过程可以将多条SQL语句包含在一起执行,ASP和数据库的交互只是输入、输出参数的一次来回传递,传递信息少,因此提高了执行效率。

2.存储过程在数据库中是经过编译后存储的,因此其执行效率比起执行同样功能的SQL语句要高很多。

3.在开发大型应用程序过程中可以将一些标准功能逻辑模块作为存储过程放在数据库中,使得模块化程序开发的结构更加清晰,而且易于维护。

更多请访问/。

相关文档
最新文档