vba+调用oracle+存储过程
Java,PLSQL调用 ORACLE存储函数以及存储过程
黑马程序员:Java,PL/SQL 调用 ORACLE 存储函数以及存储过程准备工作创建表 --- 创建测试用表 schoolCREATE TABLE school( ID number, --学校 id ---学校名NAME VARCHAR2(30) ); --- 添加数据INSERT into school values(1,'北京大学'); INSERT into school values(2,'南京大学'); INSERT into school values(1,'东京大学'); COMMIT;编写 java 代码连接数据库,获取 Connection 连接对象 public class OracleUtil { // 加载 Oracle 驱动 static { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) {黑马程序员郑州中心 编著e.printStackTrace(); } } // 获取数据库连接public static Connection getConnection() throws SQLException { Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@iP:1521:orcl", "system", "密码"); return connection; } } ——-存储函数——1.什么是存储函数存储函数又称为自定义函数。
可以接收一个或多个参数,返回一个结果。
在函数 中我们可以使用 PL/SQL 进行逻辑的处理。
oracle中存储过程的用法
在Oracle 数据库中,存储过程是一组预定义的SQL 语句,它们被封装在数据库中以便被重复使用。
存储过程通常用于完成一系列数据库操作,可以接受输入参数并返回输出。
以下是Oracle 存储过程的基本用法:创建存储过程:CREATE OR REPLACE PROCEDURE procedure_name (parameter1 IN datatype1, parameter2 OUT datatype2)IS--变量声明variable1 datatype1;BEGIN--存储过程主体,包含SQL 语句和控制流程的逻辑--例如:SELECT column1 INTO variable1 FROM table1 WHERE condition;--对变量进行其他操作--将结果赋给OUT 参数parameter2 := variable1;--可以包含其他逻辑和条件END procedure_name;/- `CREATE OR REPLACE PROCEDURE`: 创建或替换存储过程。
- `procedure_name`: 存储过程的名称。
- `(parameter1 IN datatype1, parameter2 OUT datatype2)`: 输入和输出参数的声明。
- `IS`: 存储过程主体的开始标记。
-存储过程主体包括声明变量、执行SQL 语句、逻辑控制等。
调用存储过程:DECLARE--声明变量variable2 datatype2;BEGIN--调用存储过程procedure_name(value1, variable2);--处理输出参数variable2--可以在这里使用variable2 的值END;/- `DECLARE`: 声明变量和存储过程调用的开始标记。
-变量的声明用于存储存储过程的输出参数值。
示例:假设有一个存储过程计算两个数字的和:CREATE OR REPLACE PROCEDURE AddNumbers (num1 IN NUMBER, num2 IN NUMBER, sum OUT NUMBER)ISBEGINsum := num1 + num2;END AddNumbers;/然后可以调用它:DECLAREresult NUMBER;BEGINAddNumbers(3, 5, result);DBMS_OUTPUT.PUT_LINE('Sum is: ' || result);END;/这是一个简单的示例,实际的存储过程可能包含更复杂的逻辑和多个参数。
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();}}。
VB中访问存储过程的几种办法
VB中访问存储过程的几种办法使用SQL存储过程有什么好处■SQL存储过程执行起来比SQL命令文本快得多。
当一个SQL语句包含在存储过程中时,服务器不必每次执行它时都要分析和编译它。
■调用存储过程,可以认为是一个三层结构。
这使你的程序易于维护。
如果程序需要做某些改动,你只要改动存储过程即可■你可以在存储过程中利用Transact-SQL的强大功能。
一个SQL存储过程可以包含多个SQL 语句。
你可以使用变量和条件。
这意味着你可以用存储过程建立非常复杂的查询,以非常复杂的方式更新数据库。
■最后,这也许是最重要的,在存储过程中可以使用参数。
你可以传送和返回参数。
你还可以得到一个返回值(从SQL RETURN语句)。
环境:WinXP+VB6+sp6+SqlServer2000数据库:test表:UsersCREATE TABLE [dbo].[users] ([id] [int] IDENTITY (1, 1) NOT NULL ,[truename] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[regname] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[pwd] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[sex] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,[email] [text] COLLATE Chinese_PRC_CI_AS NULL ,[jifen] [decimal](18, 2) NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]ALTER TABLE [dbo].[users] WITH NOCHECK ADDCONSTRAINT [PK_users] PRIMARY KEY CLUSTERED([id]) ON [PRIMARY]GO存储过程select_usersCREATE PROCEDURE select_users @regname char(20), @numrows int OUTPUT ASSelect * from usersSELECT @numrows = @@ROWCOUNTif @numrows = 0return 0else return 1GO存储过程insert_usersCREATE PROCEDURE insert_users @truename char(20), @regname char(20),@pwd char(20),@sex char(20),@email char(20),@jifen decimal(19,2)ASinsert into users(truename,regname,pwd,sex,email,jifen) values(@truename,@regname,@pwd,@sex,@email,@jifen)GO在VB环境中,添加DataGrid控件,4个按钮,6个文本框代码简单易懂。
VB调用ORACLE存储过程
在ADO中调用存储过程一直是一个困扰大家的问题。
其实,关于ADO调用存储过程的方法在很多书中都有讲到,标准的做法无非是按照以下步骤进行:1、生成并初始化一个_CommandPtr对象;2、生成调用存储过程需要的参数,这些参数都是_ParameterPtr对象;3、按照顺序将使用_CommandPtr的Append方法为存储过程提供参数(包括输入参数和输出参数);4、为_CommandPtr对象指定需要使用的ADO连接;5、使用_CommandPtr的Execute方法调用存储过程;6、从结果中获取返回参数的值(如果有的话)。
具体的过程在此我不详细描述,我想看看本文附带的代码就应该很明白了。
在这里我想就我使用ADO调用存储过程时的一些体会说明一下。
1、关于CreateParameter函数该函数的原型为:CreateParameter (Name, Type, Direction, Size, Value)其中Name是参数的名称,可以指定也可以不指定;Type是一个DataTypeEnum值,指定参数的类别,取值有adInteger(整型)、adChar(字符/字符串型)等;Direction是一个ParameterDirectionEnum值,其取值为adParamInput、adParamInputOutput、adParamOutput、adParamReturnValue、adParamUnknown;Size是一个Long类型的值,指示该参数值以字节计算的最大长度,例如对int型,该值可以取为sizeof(int),对Long型,该值可以取为sizeof(long),对字符串型,可以使用该字符串的长度;Value是一个variant类型的值,是该参数的取值。
在这里需要注意的是,Type参数、Direction参数以及Size参数一定要和存储过程定义时的参数相吻合,例如,如果有下面一个存储过程CREATE PROCEDURE SMS_Proc_Handle_All(@UserID Integer,@SourAddr Varchar(15),@DestAddr varchar(5000),@AvValue Single output,@ReturnInfo varchar(100) output)则Type参数的取值依次为adInteger、adChar、adChar、adSingle,adChar;Direction参数的取值依次为adParameterIn、adParameterIn、adParameterIn、adParameterOut、adParameterOut;对于输入参数,Size的值可以根据实际数值来定,对于输出参数,最好是根据定义确定(上例中ReturnInfo参数的Size值可以取为100)。
vb调用存储过程实例
vb调用存储过程实例嘿,朋友们!今天咱就来聊聊 VB 调用存储过程实例这档子事儿。
你看啊,这 VB 就像是一个聪明的小工匠,而存储过程呢,就像是一个装满了各种奇妙工具和技巧的百宝箱。
当 VB 这个小工匠想要完成一些复杂又厉害的任务时,它就得去打开那个存储过程的百宝箱,从中挑选出合适的工具来用。
比如说吧,我们要处理一堆数据,就好像要把一堆杂乱无章的积木搭建成一个漂亮的城堡。
VB 自己一个人可能会手忙脚乱,但有了存储过程,就像是有了一套详细的搭建指南。
它可以告诉 VB 该怎么一步一步地去做,先拿哪块积木,怎么摆放,怎样才能让城堡更稳固。
那怎么让 VB 顺利地调用存储过程呢?这可得有点小窍门啦!就好像你要打开一把复杂的锁,得知道怎么摆弄钥匙一样。
首先,你得告诉 VB 那个存储过程在哪里,就像是给它指明宝藏的位置。
然后呢,VB 得知道怎么和存储过程“对话”,怎么把自己的需求传达过去,又怎么接收存储过程给它的反馈。
这就好像你和朋友之间的交流,你得把你的想法清楚地说出来,朋友才能明白,然后朋友给你回应,你才能知道接下来该怎么做。
如果VB 没和存储过程“沟通”好,那可就乱套啦,就像你和朋友说话互相听不懂一样,那还怎么合作完成任务呢?在这个过程中,可不能粗心大意哦!一个小细节没注意到,可能就会导致整个程序出问题。
这就像盖房子,一块砖没放好,说不定整面墙都会倒掉呢!而且啊,不同的存储过程就像不同的百宝箱,里面的工具和方法都不一样,VB 可得好好研究,才能找到最适合的那个。
你说这 VB 调用存储过程实例是不是很有意思?它让我们能更高效地处理数据,更轻松地完成各种复杂的任务。
想想看,如果没有这种方式,我们得写多少繁琐的代码啊!现在有了它,就像是有了一个得力的助手,帮我们把那些麻烦事儿都搞定了。
所以啊,朋友们,好好去探索 VB 调用存储过程实例吧!让它为我们的程序带来更多的精彩和便利。
别害怕遇到问题,就像走路会摔跤一样,那都是成长的过程。
VB中访问存储过程
VB中访问存储过程的例子在存储过程中可以使用参数。
你可以传送和返回参数。
你还可以得到一个返回值(从SQL RETURN语句)。
环境:WinXP+VB6+sp6+SqlServer2000存储过程select_usersCREATE PROCEDURE select_users@regname char(20), @numrows int OUTPUTASSelect * from users'判断行数SELECT @numrows = @@ROWCOUNTif @numrows = 0return 0elsereturn 1GO存储过程insert_usersCREATE PROCEDURE insert_users@truename char(20),@regname char(20),@pwd char(20),@sex char(20),@email char(20),@jifen decimal(19,2)ASinsert into users(truename,regname,pwd,sex,email,jifen)values(@truename,@regname,@pwd,@sex,@email,@jifen)GO在VB 环境中,添加DataGrid 控件,4 个按钮,6 个文本框代码简单易懂。
‘引用microsoft active data object 2.X libraryOption ExplicitDim mConn As ADODB.ConnectionDim rs1 As ADODB.RecordsetDim rs2 As ADODB.RecordsetDim rs3 As ADODB.RecordsetDim rs4 As ADODB.RecordsetDim cmd As mandDim param As ADODB.Parameter' 这里用第一种方法使用存储过程添加数据Private Sub Command1_Click()Set cmd = New mandSet rs1 = New ADODB.Recordsetcmd.ActiveConnection = mConnmandText = "insert_users"mandType = adCmdStoredProcSet param = cmd.CreateParameter("truename", adChar, adParamInput, 20, Trim(txttruename.Text)) cmd.Parameters.Append paramSet param = cmd.CreateParameter("regname", adChar, adParamInput, 20, Trim(txtregname.Text)) cmd.Parameters.Append paramSet param = cmd.CreateParameter("pwd", adChar, adParamInput, 20, Trim(txtpwd.Text))cmd.Parameters.Append paramSet param = cmd.CreateParameter("sex", adChar, adParamInput, 20, Trim(txtsex.Text))cmd.Parameters.Append paramSet param = cmd.CreateParameter("email", adChar, adParamInput, 20, Trim(txtemail.Text)) cmd.Parameters.Append paramSet param = cmd.CreateParameter("jifen", adSingle, adParamInput, 50, Val(txtjifen.Text))cmd.Parameters.Append paramSet rs1 = cmd.ExecuteSet cmd = NothingSet rs1 = NothingEnd Sub' 利用存储过程显示数据‘要处理多种参数,输入参数,输出参数以及一个直接返回值Private Sub Command3_Click()Set rs4 = New ADODB.RecordsetSet cmd = New mandcmd.ActiveConnection = mConnmandText = "select_users"mandType = adCmdStoredProc' 返回值Set param = cmd.CreateParameter("RetVal", adInteger, adParamReturnValue, 4)cmd.Parameters.Append param' 输入参数Set param = cmd.CreateParameter("regname", adChar, adParamInput, 20, Trim(txtregname.Text)) cmd.Parameters.Append param' 输出参数Set param = cmd.CreateParameter("numrows", adInteger, adParamOutput)cmd.Parameters.Append paramSet rs4 = cmd.Execute()If cmd.Parameters("RetVal").Value = 1 Then'MsgBox cmd.Parameters("numrows").ValueSet DataGrid1.DataSource = rs4DataGrid1.RefreshElseMsgBox " 没有记录"End IfEnd Sub。
VBA操作数据库存储过程的技巧与示例
VBA操作数据库存储过程的技巧与示例在使用VBA进行数据库操作时,使用存储过程可以提高效率和安全性。
存储过程是一组预先编写好的SQL语句,可以在数据库中存储和执行。
本文将介绍如何使用VBA操作数据库存储过程,并提供一些示例供参考。
1. 连接数据库在使用VBA操作数据库存储过程之前,首先需要连接到目标数据库。
可以使用ADODB对象来连接数据库,例如:```vbaDim conn As ObjectSet conn = CreateObject("ADODB.Connection")conn.ConnectionString = "Provider=SQLOLEDB;Data Source=服务器地址;Initial Catalog=数据库名称;User ID=用户名;Password=密码"conn.Open```在此示例中,需要替换"服务器地址"、"数据库名称"、"用户名"和"密码"为实际的连接信息。
2. 创建存储过程使用VBA创建存储过程可以通过在数据库中执行CREATE PROCEDURE语句来实现。
例如,创建一个简单的更新存储过程:```vbaDim strSQL As StringstrSQL = "CREATE PROCEDURE UpdateEmployee@EmployeeID INT, @FirstName VARCHAR(50), @LastName VARCHAR(50) AS" & _" UPDATE Employee SET FirstName = @FirstName, LastName = @LastName WHERE EmployeeID = @EmployeeID"conn.Execute strSQL```在此示例中,UpdateEmployee是存储过程的名称,@EmployeeID、@FirstName和@LastName是存储过程的参数,Employee是数据库中的表。
VBA连接Oracle和SQL
VBA操作数据库' 连接Oracle数据库Dim cn As ADODB.ConnectionSet cn = New ADODB.Connection码;Persist Security Info=True"cn.Execute ("执行的数据库更新语句")' 通过表或者查询创建数据集Dim rs As ADODB.RecordsetSet rs = New ADODB.Recordsetrs.Open "表名", cn, adOpenKeyset, adLockOptimisticMsgBox rs.RecordCountrs.Closers.Open "Select 字段 From 表名 Where 条件", cn, adOpenKeyset, adLockOptimistic MsgBox rs.RecordCount' 关闭数据集和数据连接rs.CloseSet rs = Nothingcn.CloseSet cn = NothingEnd SubADODB方式连接SqlServer数据库数据库连接方法:Public Function conn_sqlServer(ByVal serverIP As String, _userid As String, _password As String, _database As String) As ConnectionDim sConStr As StringsConStr = "driver=sql server;" _& "server=" & serverIP _& ";Uid=" & userid _& ";Pwd=" & password _& ";Database=" & databaseSet conn = New ADODB.Connectionconn.Open sConStrIf conn Is Nothing ThenMsgBox "连接已关闭"Exit FunctionElseSet conn_sqlServer = connEnd Function其中,各参数代表的意义如下:码、database:数据库的实例名。
用vb调用存储过程方法
中如何调用存储过程2011-03-28 14:08:45| 分类:.net |举报|字号订阅下载LOFTER客户端此页涉及到的存储过程的创建,在存储过程的创建中有源码1、调用无参数存储过程dim conn As New SqlConnectiondim FBasicDataRecord as new BasicDataRecord()conn.ConnectionString = "Data Source=(local);Initial Catalog=LineManager;User ID=sa;Password=1"conn.Open()Dim cmd As SqlCommandcmd = New SqlCommand("GetNewestData", conn) -------要调用存储过程名称mandType = CommandType.StoredProcedure -----------关键,要想调用存储过程,需将commandtype类型设置为storedprocedureDim myReader As SqlDataReaderTrymyReader = cmd.ExecuteReader() -------------执行存储过程If myReader.Read() ThenFBasicDataRecord.mySetDateTime = myReader.GetDateTime(0)FBasicDataRecord.myHalfHourCost = myReader.GetDecimal(1)FBasicDataRecord.myUnitTime = myReader.GetInt32(2)FBasicDataRecord.myPrepareTime = myReader.GetInt32(3)FBasicDataRecord.myLeastCurrency = myReader.GetDecimal(4)FBasicDataRecord.myUserName = myReader.GetString(5)Return TrueElseReturn FalseEnd IfCatch ex As ExceptionReturn ex.MessageFinallyconn.close()End Try2、调用有参数存储过程Dim cmd As SqlCommanddim conn As New SqlConnectionconn.ConnectionString = "Data Source=(local);Initial Catalog=LineManager;User ID=sa;Password=1"conn.Open()cmd = New SqlCommand("ProcCharge", conn) --------存储过程名称mandType = CommandType.StoredProcedure ----------改变类型Dim a As New SqlParameter("@CardNo", SqlDbType.VarChar) ------------将存储过程中涉及的参数加入进来,并附值。
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调⽤存储过程的例⼦⼀样。
java调用Oracle存储过程方式汇总
spring调用Oracle存储过程,并用cursor返回结果集1. 创建表:Java代码1.create table TEST_USERS2.(3. USER_ID VARCHAR2(10) not null,4. NAME VARCHAR2(10) not null,5. PASSWORD VARCHAR2(20) not null6.)2. 创建存储过程:Java代码1.create or replace package display_users_package is2. type search_results is ref cursor;3. procedure display_users_proc(results_out out search_results, userId in test_er_id%type);4.end display_users_package;5.6.create or replace package body display_users_package is7. procedure display_users_proc(results_out out search_results, userId in test_er_id%type)8. is9. begin10. if userId is not null then11. open results_out for select * from test_users where user_id like userId || '%';12. else13. open results_out for select * from test_users;14. end if;15. end display_users_proc;16.end display_users_package;这个results_out是一个游标类型,用来返回查找的结果集。
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;这几种类型都可以作为返回值,而且,后两种类型,常常可以以多维数组的形式返回。
如何用Visual Basic 6.0调用Oracle存储过程及传递参数
rc C U kw d m Tx时 命 有 参 考 资 料 都 没 提 及 如 何 与 O al数 据 库 交 换 数 据 的 具 体 的 方 Po。 如 果 选 择 Ad md n o n和 A C d e t ,就 可 在 “ rc e 令文本 ” 中 直接 输 入 S QL命 令 。 如 果 选 择 a C d al, a— d m Tb e d 法。
维普资讯
第 9卷 第 4期 湖南商学院学报 ( 月刊 ) 双
J OURNAL OF HU NAN BUSI NES S COLLEGE
V . NO. O1 9 420 0 2年 7月
J l. o 2 l 2o 1
如 何 用 Viu lBa i 0调 用 0r ce a c6. s s l a
存 储 过 程 及 传 递 参 数
肖, 1 L3 ,B
( 湖南商学 院 计算机 系,湖南长 沙 400 ) 12 5
[ 摘 要 ]本 文讨论 。在 Vsa B s 6 0下,利用 AD i l ai . u c O的程序对 象,调 用在 O al rce 8下的存储 过程 ,及如何传 递存 储过程的参数 。 [ 关键词 ]存储 过程 ;Orc al e数据库 ;A DO控件 ;参数传 递
对 象 的 D tS uc 属 性 上 ,如 :D tG d 象 、FeG i 对 象 。 aa ore aa r 对 i Ix r d
it e :AD e O)控 件
Mi oot 近 开 发 的 一 组 数 据 访 问 对 象 是 A t e 数 据 对 c sf最 r ci X v
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
End Function
其中,参数conn:数据库连接、pr_restore_name:存储过程
工具-->引用-->Microsoft ActiveX Data Objects 2.8勾上,确定(此处2.8为最高的一项)
示例代码如下:
Sub test()
Public Function callPr_restore(ByVal conn As Connection, pr_restore_name As String)
Dim CNN_cmd As mand
Set CNN_cmd = New mand
Dim i As Integer
Dim connStr As String
Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
i = 0
connStr = "Provider=MSDAORA.1;Data Source=dbname"
参数值)
.Parameters(1).Value = "20030611"
.Parameters.Append .CreateParameter("stunum", adVarChar, adParamInput, 10, "20030610")
End Sub
If Not rs.EOF Then
MsgBox rs.Fields.Count '输出列数
End If
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
.Parameters.Append .CreateParameter("sPrefix", adVarChar, adParamInput, 4, "2004")
.Parameters.Append .CreateParameter("iLength", adInteger, adParamInput, , 5)
.Parameters.Append .CreateParameter("sSequenceNumber", adVarChar, adParamOutput, 7,
ห้องสมุดไป่ตู้
sSequenceNumber)
End With
'---------------------------------------END--------------------------------------------
With CNN_cmd
' 两种方式给参数赋值
' 第一种:CNN_cmd.P阿rameters(参数索引).value = 参数值
' 第二种:.CNN_cmd.Parameters.Append .CreateParameter(参数名,adVarChar, adParamInput, 10,
Set CNN_cmd.ActiveConnection = conn
CNN_mandText = pr_restore_name
CNN_mandType = adCmdStoredProc
'------------------------有参存储过程加以下代码----------------------------------
Set conn = New ADODB.Connection
conn.Open connStr, "username", "password"
Set rs = New ADODB.Recordset
rs.Open "select * from tablename", conn