Oracle集合类型输出参数的PLSQL存储过程及其Java调用

Oracle集合类型输出参数的PLSQL存储过程及其Java调用
Oracle集合类型输出参数的PLSQL存储过程及其Java调用

Oracle集合类型输出参数的PL/SQL存储过程及其Java调用- -

有段时间为了用存储过程做统计报表,写了这文章。

现在的java的数据库-关系映射技术似乎不提倡用存储过程,其实存储过程更能发挥数据库的效率。

1 引言

存储过程因其执行效率高、与事务处理的结合、运行更安全等优点,在数据库应用程序中被广泛采用。PL/SQL是用于从各种环境中访问Oracle数据库的一种编程语言,它与数据库服务器集成在一起,PL/SQL编写的存储过程编译效率高,网络系统开销小,同时PL/SQL直观性好,是大多数人的选择。

以Number、Varchar等基本标量类型为输出参数的PL/SQL存储过程,每个输出参数只能返回一个对应值。而在实际数据库应用程序中,尤其是在进行系统综合查询统计时,往往需要返回二维数组或结果集,这时应考虑在存储过程中使用集合这种数据结构。对于集合,我们可以一次把许多元素作为一个整体进行操作,也可以对集合中的单个元素进行操作,使用方便、灵活。

2 PL/SQL存储过程及Java程序的编写

2.1 索引表作为输出参数

索引表是无约束的,其大小的唯一限制(除可用内存外)就是它的关键字BINARY_INTEGER类型所能表示数值的约束(-2147483647...+2147483647),其元素不需要按任何特定顺序排列。在声明时,我们不需要指定其大小,而且对索引表的元素可以直接赋值,不用初始化,可见使用索引表极其方便。

2.1.1存储过程的编写

我们可以在PL/SQL语句块中定义索引表,但作为输出参数的索引表,必须要在包(package)里定义,方法如下:

create or replace package out_param is

---- 定义了元素是varchar2类型的一个索引表类型

type out_index_table_typ is table of varchar2(50) index by binary_integer;

end out_param;

接下来就可以在pl/sql存储过程里引用在包里定义的索引表类型:

create or replace procedure testPro1(in_param in varchar2,o_table out out_param. out_index_table_typ ) is

begin

-------这里略去程序体

end testPro1;

其中,返回的索引表类型前必须用包名加上句点来引用out_param. out_index_table_typ 2.1.2 J ava程序的编写

索引表与数据库表很形似,有key和value两列,但它不是真正的数据库表,不可以存储到数据库中。因此索引表不能使用SQL进行操作,这样它的内容不能通过一个标准的SELECT

语句返回游标得到。这一点与嵌套表有很大不同。由存储过程返回的索引表可以映射成java 数组类型、JDBC Datatypes的BigDecimal[]数组类型和oracle的Datum[]数组。有一点要注意,尽管索引表中的元素不一定要按任何特定顺序排列,其元素可以借助于任意有效关键字而插入,但对映射数组元素的引用应该从1开始,而且要连续,否则映射成数组时会出现null元素。

下面示例为将索引表映射成java数组类型。

import oracle.jdbc.*;

import oracle.sql.*;

import java.sql.*;

public class ReturnIndexTable

{ Connection ociconn=null;

OracleCallableStatement stmt =null;

public String[] getTable(String in_param)

{ String[] reAry=null;

try

{ OracleDriver S_Driver=null;

if(S_Driver==null)

S_Driver=new oracle.jdbc.OracleDriver();

DriverManager.registerDriver(S_Driver);

String url="jdbc:oracle:oci8:@test";

String user="user";

String password=" password";

ociconn= DriverManager.getConnection(url,user,password);

stmt =(OracleCallableStatement)ociconn.prepareCall("begin testPro1(?,?); end;");

// 返回的索引表最大长度(可以大于索引表实际长度)

int maxLen =31;

// 索引表元素类型

int elemSqlType = OracleTypes.V ARCHAR;

//索引表元素长度(CHAR, V ARCHAR or RAW),其它元素类型可忽略该项值,但该参数仍须定义

int elemMaxLen=50;

stmt.setString(1,in_param);

// 注册返回参数

stmt.registerIndexTableOutParameter(2,maxLen,elemSqlType,elemMaxLen);

stmt.execute();

// 返回数组类型

reAry=(String[])stmt.getPlsqlIndexTable(2);

}

catch (Exception e)

{e.printStackTrace();

}

finally

{return reAry;

}

}

//关闭连接.............

}

2.2 可变数组作为输出参数

可变数组和另外两种集合类型不同,其元素在内存中是连续存储的,且在大小方面有一个固定的上界。声明时需要指定该数组中元素的最大数目(可变数组的大小可以用EXTEND方法来增加,但不能被扩展超过所声明的极限大小)。

可变数组的元素被赋值之前,必须使用构造器进行初始化。元素插入数组时应从索引1开始,连续插入。

2.2.1存储过程的编写

可变数组的定义方法如下:

create or replace type testArray is varray(5) of number(3)

PL/SQL存储过程里调用可变数组作为输出参数:

create or replace function getTestArray return testArray

as

o_data testArray:= testArray ();

begin

for v_count in 1..5 loop

o_data.extend;

o_data(v_count):= v_count;

end loop;

return o_data;

end;

2.2.2 J ava程序的编写

由存储过程返回的可变数组同样可以映射成java数组类型。但Java程序调用存储过程返回的可变数组方式和索引表方式却不相同,这一点应注意,具体方法如下:

public static void main( )

{

......

//调用存储过程

. OracleCallableStatement stmt =(OracleCallableStatement)conn.prepareCall ( "begin ? := getTestArray; end;" );

stmt.registerOutParameter( 1, OracleTypes.ARRAY," testArray" );

stmt.executeUpdate();

// 得到ARRAY 对象

ARRAY simpleArray = stmt.getARRAY(1);

//转换为java数组

String[ ] values = (String[])simpleArray.getArray();

//输出数组内容

for( int i = 0; i < values.length; i++ )

System.out.println( "row " + i + " = '" + values[i] +"'" );

}

2.3 嵌套表作为输出参数

存储过程中使用嵌套表,并不是直接将嵌套表作为输出参数,而是对嵌套表"造型"后以游标形式输出。嵌套表的基本功能与索引表相同,但嵌套表可以使用SQL进行操作,其内容可通过SELECT 语句查询并"造型"后以游标形式返回。在大多数的查询统计中,常常需要返回结果集,这时使用嵌套表就尤其方便。笔者在开发过程中深刻体会到使用对象嵌套表可以解决绝大多数的查询统计问题。下面着重介绍如何在存储过程里利用对象类型的嵌套表。

下面通过构造对象,然后对包含对象的嵌套表进行造型,返回游标得到结果集。

2.3.1 存储过程的编写

首先构造统计对象如下:

create or replace type TestObj as object

(

vname varchar2(20), --名称

item1 number, --统计项目1

item2 number, --统计项目2

item3 number, --统计项目3

item4 number --统计项目4

);

构造包含对象类型的嵌套表:

create or replace type TestNestTable as table of TestObj;

定义对索引表"造型"后的输出的游标类型:

create or replace package out_param is

type out_cur is ref cursor;

下面是嵌套表作为输出参数的存储过程:

create or replace procedure testPro2(o_cur out out_param.out_cur ) is

---- 包含对象的嵌套表变量的声明

v_objTable TestNestTable:= TestNestTable ();

begin

--嵌套表变量的使用

v_objTable.extend;

v_objTable(1):= TestObj(‘张三',12,123,123,34);

v_objTable.extend;

v_objTable(2):= TestObj(‘李四,22,223,223,234);

--对嵌套表进行"造型"返回游标

open o_cur for select * from Table(cast (v_objTable as TestNestTable) );

end testPro2;

2.3.2 J ava程序的编写

//从游标返回结果集

public ResultSet getCursor()

{

{

......

stmt =(CallableStatement )conn.prepareCall("call testPro2(?)");

//注册游标对象类型

stmt.registerOutParameter(1,OracleTypes.CURSOR);

stmt.execute();

//返回结果集

ResultSet Rs=(ResultSet)stmt.getObject(1);

}

catch(Exception e)

{

}

return Rs;

}

3 结束语

使用索引表和可变数组,可将返回的集合映射成Java数组。由于索引表会自动分配空间,在声明时不需要指定其大小,而且不需要初始化,使用起来比较方便。但是索引表作为输出参数只能使用oci驱动(返回游标时,可以用瘦客户驱动也可以用oci驱动),所需要的动态连接库文件(ocijdbc9.dll)要在环境变量里进行设置(例如:path=D:\oracle\ora90\BIN),在不同的环境下OCI驱动还可能出现类装载异常,所以返回索引表尽管方便,但偶尔会出现意想不到的错误。可变数组映射成Java数组简单,对于返回小数据量的结果,也是不错的选择,但使用可变数组作为输出参数,声明时必须限定该数组的大小上限,并且需使用构造器初始化。

使用嵌套表,可以对嵌套表进行SQL操作,其内容能通过对标准的SELECT 语句造型后可转化为游标输出。而且嵌套表的内容相当于session变量,当断开连接后即释放内存,但同样存在需要初始化和扩展的问题。

综上所述,究竟采用索引表、嵌套表和可变数组中哪一种作为存储过程的输出要看具体的要求和开发环境。有一点我们需要注意,如果返回的数据量较大,以数组形式返回,则需一次性取回所有结果,在PL/SQL里为所有结果分配空间并复制,然后将这些数据通过网络发送到客户端,客户端也同样需要分配空间接受这些数据;而采用游标形式,只要返回一个指针,然后分批返回结果(可自定义每次返回记录的条数),而不是一次性返回所有结果,因此在客户端不需分配大块的空间存放所有结果。可见,对于大数据量的应用程序,返回游标程序运行效率会更高。Oracle集合类型输出参数的PL/SQL存储过程及其Java调用

1 引言

存储过程因其执行效率高、与事务处理的结合、运行更安全等优点,在数据库应用程序中被广泛采用。PL/SQL是用于从各种环境中访问Oracle数据库的一种编程语言,它与数据库服务器集成在一起,PL/SQL编写的存储过程编译效率高,网络系统开销小,同时PL/SQL直观性好,是大多数人的选择。

以Number、Varchar等基本标量类型为输出参数的PL/SQL存储过程,每个输出参数只能返回一个对应值。而在实际数据库应用程序中,尤其是在进行系统综合查询统计时,往往需要返回二维数组或结果集,这时应考虑在存储过程中使用集合这种数据结构。对于集合,我们可以一次把许多元素作为一个整体进行操作,也可以对集合中的单个元素进行操作,使用方便、灵活。

2 PL/SQL存储过程及Java程序的编写

2.1 索引表作为输出参数

索引表是无约束的,其大小的唯一限制(除可用内存外)就是它的关键字BINARY_INTEGER类型所能表示数值的约束(-2147483647...+2147483647),其元素不需要按任何特定顺序排列。在声明时,我们不需要指定其大小,而且对索引表的元素可以直接赋值,不用初始化,可见使用索引表极其方便。

2.1.1存储过程的编写

我们可以在PL/SQL语句块中定义索引表,但作为输出参数的索引表,必须要在包(package)里定义,方法如下:

create or replace package out_param is

---- 定义了元素是varchar2类型的一个索引表类型

type out_index_table_typ is table of varchar2(50) index by binary_integer;

end out_param;

接下来就可以在pl/sql存储过程里引用在包里定义的索引表类型:

create or replace procedure testPro1(in_param in varchar2,o_table out out_param. out_index_table_typ ) is

begin

-------这里略去程序体

end testPro1;

其中,返回的索引表类型前必须用包名加上句点来引用out_param. out_index_table_typ 2.1.2 J ava程序的编写

索引表与数据库表很形似,有key和value两列,但它不是真正的数据库表,不可以存储到数据库中。因此索引表不能使用SQL进行操作,这样它的内容不能通过一个标准的SELECT 语句返回游标得到。这一点与嵌套表有很大不同。由存储过程返回的索引表可以映射成java 数组类型、JDBC Datatypes的BigDecimal[]数组类型和oracle的Datum[]数组。有一点要注意,尽管索引表中的元素不一定要按任何特定顺序排列,其元素可以借助于任意有效关键字而插入,但对映射数组元素的引用应该从1开始,而且要连续,否则映射成数组时会出现null元素。

下面示例为将索引表映射成java数组类型。

import oracle.jdbc.*;

import oracle.sql.*;

import java.sql.*;

public class ReturnIndexTable

{ Connection ociconn=null;

OracleCallableStatement stmt =null;

public String[] getTable(String in_param)

{ String[] reAry=null;

try

{ OracleDriver S_Driver=null;

if(S_Driver==null)

S_Driver=new oracle.jdbc.OracleDriver();

DriverManager.registerDriver(S_Driver);

String url="jdbc:oracle:oci8:@test";

String user="user";

String password=" password";

ociconn= DriverManager.getConnection(url,user,password);

stmt =(OracleCallableStatement)ociconn.prepareCall("begin testPro1(?,?); end;");

// 返回的索引表最大长度(可以大于索引表实际长度)

int maxLen =31;

// 索引表元素类型

int elemSqlType = OracleTypes.V ARCHAR;

//索引表元素长度(CHAR, V ARCHAR or RAW),其它元素类型可忽略该项值,但该参数仍须定义

int elemMaxLen=50;

stmt.setString(1,in_param);

// 注册返回参数

stmt.registerIndexTableOutParameter(2,maxLen,elemSqlType,elemMaxLen);

stmt.execute();

// 返回数组类型

reAry=(String[])stmt.getPlsqlIndexTable(2);

}

catch (Exception e)

{e.printStackTrace();

}

finally

{return reAry;

}

}

//关闭连接.............

}

2.2 可变数组作为输出参数

可变数组和另外两种集合类型不同,其元素在内存中是连续存储的,且在大小方面有一个固定的上界。声明时需要指定该数组中元素的最大数目(可变数组的大小可以用EXTEND方法来增加,但不能被扩展超过所声明的极限大小)。

可变数组的元素被赋值之前,必须使用构造器进行初始化。元素插入数组时应从索引1开始,连续插入。

2.2.1存储过程的编写

可变数组的定义方法如下:

create or replace type testArray is varray(5) of number(3)

PL/SQL存储过程里调用可变数组作为输出参数:

create or replace function getTestArray return testArray

as

o_data testArray:= testArray ();

begin

for v_count in 1..5 loop

o_data.extend;

o_data(v_count):= v_count;

end loop;

return o_data;

end;

2.2.2 J ava程序的编写

由存储过程返回的可变数组同样可以映射成java数组类型。但Java程序调用存储过程返回的可变数组方式和索引表方式却不相同,这一点应注意,具体方法如下:

public static void main( )

{

......

//调用存储过程

. OracleCallableStatement stmt =(OracleCallableStatement)conn.prepareCall ( "begin ? := getTestArray; end;" );

stmt.registerOutParameter( 1, OracleTypes.ARRAY," testArray" );

stmt.executeUpdate();

// 得到ARRAY 对象

ARRAY simpleArray = stmt.getARRAY(1);

//转换为java数组

String[ ] values = (String[])simpleArray.getArray();

//输出数组内容

for( int i = 0; i < values.length; i++ )

System.out.println( "row " + i + " = '" + values[i] +"'" );

}

2.3 嵌套表作为输出参数

存储过程中使用嵌套表,并不是直接将嵌套表作为输出参数,而是对嵌套表"造型"后以游标形式输出。嵌套表的基本功能与索引表相同,但嵌套表可以使用SQL进行操作,其内容可通过SELECT 语句查询并"造型"后以游标形式返回。在大多数的查询统计中,常常需要返回结果集,这时使用嵌套表就尤其方便。笔者在开发过程中深刻体会到使用对象嵌套表可以解决绝大多数的查询统计问题。下面着重介绍如何在存储过程里利用对象类型的嵌套表。对于任意的统计分析表格,我们可以将其简化成下面的输出形式:

这样我们把每一行看作是一个对象实例,该行的每一列则可以看作是该对象的一个属性,下面通过构造对象,然后对包含对象的嵌套表进行造型,返回游标得到结果集。

2.3.1 存储过程的编写

首先构造统计对象如下:

create or replace type TestObj as object

(

vname varchar2(20), --名称

item1 number, --统计项目1

item2 number, --统计项目2

item3 number, --统计项目3

item4 number --统计项目4

);

构造包含对象类型的嵌套表:

create or replace type TestNestTable as table of TestObj;

定义对索引表"造型"后的输出的游标类型:

create or replace package out_param is

type out_cur is ref cursor;

下面是嵌套表作为输出参数的存储过程:

create or replace procedure testPro2(o_cur out out_param.out_cur ) is

---- 包含对象的嵌套表变量的声明

v_objTable TestNestTable:= TestNestTable ();

begin

--嵌套表变量的使用

v_objTabl.extend;

v_objTable(1):= TestObj(‘张三',12,123,123,34);

v_objTabl.extend;

v_objTable(2):= TestObj(‘李四,22,223,223,234);

--对嵌套表进行"造型"返回游标

open o_cur for select * from Table(cast (v_objTable as TestNestTable) );

end testPro2;

2.3.2 J ava程序的编写

//从游标返回结果集

public ResultSet getCursor()

{

try

{

......

stmt =(CallableStatement )conn.prepareCall("call testPro2(?)");

//注册游标对象类型

stmt.registerOutParameter(1,OracleTypes.CURSOR);

stmt.execute();

//返回结果集

ResultSet Rs=(ResultSet)stmt.getObject(1);

}

catch(Exception e)

{

}

return Rs;

}

3 结束语

使用索引表和可变数组,可将返回的集合映射成Java数组。由于索引表会自动分配空间,在声明时不需要指定其大小,而且不需要初始化,使用起来比较方便。但是索引表作为输出参数只能使用oci驱动(返回游标时,可以用瘦客户驱动也可以用oci驱动),所需要的动态连接库文件(ocijdbc9.dll)要在环境变量里进行设置(例如:path=D:\oracle\ora90\BIN),在

不同的环境下OCI驱动还可能出现类装载异常,所以返回索引表尽管方便,但偶尔会出现意想不到的错误。可变数组映射成Java数组简单,对于返回小数据量的结果,也是不错的选择,但使用可变数组作为输出参数,声明时必须限定该数组的大小上限,并且需使用构造器初始化。

使用嵌套表,可以对嵌套表进行SQL操作,其内容能通过对标准的SELECT 语句造型后可转化为游标输出。而且嵌套表的内容相当于session变量,当断开连接后即释放内存,但同样存在需要初始化和扩展的问题。

综上所述,究竟采用索引表、嵌套表和可变数组中哪一种作为存储过程的输出要看具体的要求和开发环境。有一点我们需要注意,如果返回的数据量较大,以数组形式返回,则需一次性取回所有结果,在PL/SQL里为所有结果分配空间并复制,然后将这些数据通过网络发送到客户端,客户端也同样需要分配空间接受这些数据;而采用游标形式,只要返回一个指针,然后分批返回结果(可自定义每次返回记录的条数),而不是一次性返回所有结果,因此在客户端不需分配大块的空间存放所有结果。可见,对于大数据量的应用程序,返回游标程序运行效率会更高。

oracle实验--存储过程

实验八存储过程的使用 一、实验目的 1、熟练掌握存储过程的定义及使用 二、实验要求 1、实验前做好上机实验的准备,针对实验内容,认真复习与本次实验有关的知识,完成 实验内容的预习准备工作; 2、能认真独立完成实验内容; 3、实验后做好实验总结,根据实验情况完成实验报告。 三、实验内容 创建图书管理库的图书、读者和借阅三个基本表的表结构: 图书表: BOOK ( BOOK_ID NUMBER(10), SORT V ARCHAR2(10), BOOK_NAME V ARCHAR2(50), WRITER V ARCHAR2(10), OUTPUT V ARCHAR2(50), PRICE NUMBER(3)); 读者表 READER ( READER_ID NUMBER(3), COMPANY V ARCHAR2(10), NAME V ARCHAR2(10), SEX V ARCHAR2(2), GRADE V ARCHAR2(10), ADDR V ARCHAR2(50)); 借阅表 BORROW ( READER_ID NUMBER(3),

BOOK_ID NUMBER(10), BORROW_DA TE DA TE); 插入数据: BOOK表: insert into book values(445501,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445502,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(445503,'TP3/12','数据库导论','王强','科学出版社',17.90); insert into book values(332211,'TP5/10','计算机基础','李伟','高等教育出版社',18.00); insert into book values(112266,'TP3/12','FoxBASE','张三','电子工业出版社',23.60); insert into book values(665544,'TS7/21','高等数学','刘明','高等教育出版社',20.00); insert into book values(114455,'TR9/12','线性代数','孙业','北京大学出版社',20.80); insert into book values(113388,'TR7/90','大学英语','胡玲','清华大学出版社',12.50); insert into book values(446601,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446602,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(446603,'TP4/13','数据库基础','马凌云','人民邮电出版社',22.50); insert into book values(449901,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(449902,'TP4/14','FoxPro大全','周虹','科学出版社',32.70); insert into book values(118801,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); insert into book values(118802,'TP4/15','计算机网络','黄力钧','高等教育出版社',21.80); READER表: insert into reader values(111,'信息系','王维利','女','教授','1号楼424'); insert into reader values(112,'财会系','李立','男','副教授','2号楼316'); insert into reader values(113,'经济系','张三','男','讲师','3号楼105'); insert into reader values(114,'信息系','周华发','男','讲师','1号楼316'); insert into reader values(115,'信息系','赵正义','男','工程师','1号楼224'); insert into reader values(116,'信息系','李明','男','副教授','1号楼318'); insert into reader values(117,'计算机系','李小峰','男','助教','1号楼214'); insert into reader values(118,'计算机系','许鹏飞','男','助工','1号楼216'); insert into reader values(119,'计算机系','刘大龙','男','教授','1号楼318'); insert into reader values(120,'国际贸易','李雪','男','副教授','4号楼506'); insert into reader values(121,'国际贸易','李爽','女','讲师','4号楼510'); insert into reader values(122,'国际贸易','王纯','女','讲师','4号楼512'); insert into reader values(123,'财会系','沈小霞','女','助教','2号楼202'); insert into reader values(124,'财会系','朱海','男','讲师','2号楼210'); insert into reader values(125,'财会系','马英明','男','副教授','2号楼212'); BORROW表:

plsql安装和配置连接教程(附一些常用设置)

plsql安装和配置连接教程 总体步骤:先安装oracle client端,然后安装plsql,配置tnsname.ora 一:安装oracle client端 下载地址: 1.加压文件,安装oracle客户端 打开安装包,找到setup.exe,开始安装。报错,具体原因和解决办法和安装oracle服务端方法一样。只是要多修改一个文件,在两个文件里添加同样的内容即可。 解决办法很简单,这是因为版本注册问题,默认oracle 11没有添加win10的注册信息,所以要讲win10的注册信息添加到oracle的配置文件里。打开oracle安装包,找到stage文件夹,找到cvu_prereq.xml文件,用记事本打开可以看到如下内容,在标签最后添加如下红色部分。

上面报错信息修改完成以后,重新setup.ext,下面界面选择“管理员”模式 安装以后在network\ADMIN文件夹中配置tnsnames.ora文件,如图:

如果client文件夹中没有network文件夹,说明安装client时安装类型没选对,这时也可以从instantclient包中,把network文件夹拷入client的目录下。 此时,基础环境已经配置完毕。 二:安装plsqldevlop 安装完毕后,不要输入账号密码先进入工具 点tools—preferences—输入client端的目录地址和oci.dll文件的地址 三:配置系统环境 右击我的电脑—属性—高级系统设置—环境变量 编辑Path,添加client端地址

(Oracle管理)SQL中调用ORACLE存储过程

SQL Server 调用Oracle的存储过程收藏 原文如下: 通过SQL Linked Server 执行Oracle 存储过程小结 1 举例 我们可以通过下面的方法在SQL Server中通过Linked Server 来执行Oracle 存储过程。 (1) Oracle Package PACKAGE Test_PACKAGE AS TYPE t_t is TABLE of VARCHAR2(30) INDEX BY BINARY_INTEGER; PROCEDURE Test_procedure1 ( p_BATCH_ID IN VARCHAR2, p_Number IN number, p_MSG OUT t_t, p_MSG1 OUT t_t ); END Test_PACKAGE; PACKAGE BODY Test_PACKAGE AS PROCEDURE Test_procedure1 ( p_BATCH_ID IN VARCHAR2, p_Number IN number, p_MSG OUT t_t, p_MSG1 OUT t_t ) AS BEGIN p_MSG(1):='c'; p_MSG(2):='b'; p_MSG(3):='a';

p_MSG1(1):='abc'; RETURN; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END Test_procedure1; END Test_PACKAGE; (2) 在SQL Server中通过Linked Server 来执行Oracle 存储过程 declare @BatchID nvarchar (40) declare @QueryStr nvarchar (1024) declare @StatusCode nvarchar(100) declare @sql nvarchar(1024) set @BatchID='AAA' SET @QueryStr='{CALL GSN. Test_PACKAGE.Test_procedure1('''''+@BatchID +''''',''''4'''',{resultset 3, p_MSG},{resultset 1, p_MSG1})}' (3)执行结果 (a) select @sql='SELECT @StatusCode=p_msg FROM OPENQUERY (HI4DB_MS,'' '+@QueryStr+''')' exec sp_executesql @sql,N'@StatusCode nvarchar(100) output',@StatusCod e output print @StatusCode 答案:@StatusCode=’a’ (b) select @sql='SELECT top 3 @StatusCode=p_msg FROM OPENQUERY (HI4DB

PLSQL Developer连虚拟机Linux下的Oracle

一、工作环境 1,本地机器操作系统为windows 7; 2,虚拟机为VM ware; 3,虚拟机操作系统为Linux,系统上已安装Oracle,并有一个实例(orcl) 二、所需工具 1,PL/SQL Developer; 2,VNC-Viewer; 3,XManager Enterprise; 三、具体步骤 1,测试本地机器与虚拟机之间的网络通畅 2,关闭Linux的防火墙 1)在linux的输入:vncserver,启动VNC服务 2)双击VNC Viewer软件,输入Linux的IP地址与端口号,点击“Connect”,输入密码连接Linux;

3)在VNC Viewwe程序中右击,选择“Open Terminal”,打开一个terminal,输入命令:setup,如果不是以root用户登录的Linux,在这里需要输入root用户的password,进入如下界面,选择“Firewall Configuration“,移动光标至“Run Tool”,回车。 4)选择“Disabled”,移动光标至“OK”,回车;

5)至此,Linux的防火墙已关闭; 3,启动数据库的监听(Listener)服务 1)先测试是否有Listener,并查看其状态,在VNC Viewer的terminal中输入:lsntctl status,查看Listener 上图显示Linux上已有Listenter 2)若无Listener,则需新建Listener,在VNC Viewer的terminal中输入:netca,新建一个Listener。如下图所示,然后下一步下一步。

plsql远程访问数据库 解决ora12541:TNS无监听程序

本机为win7 32位系统,为了学习oracle,装了个vbox虚拟机,再装了个win7虚拟机,内装oracle 11g(win7如果要装10g,要选择vista版本,win版本会安装报错).oracle11g安装完后有报了个错误,当时没注意,现在也忘了什么错了,但是不影响使用.后来想在本机安装plsql来远程连接虚win7上的oracle.查了一些资料,步骤如下: 1.下载plsql,安装. 2.下载Instant Client,点击下载,下载第一个basic就行了,下载完解压缩,以放到主win7 d盘根目录为 例:d:\instantclient_11_2 3.在d:\instantclient_11_2新建tnsnames.ora,用记事本编辑. 4.到虚win7上的oracle安装目录找到…\app\admin\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora,打开,比如数据库实例是orcl,找到如下代码,拷贝到本机d:\instantclient_11_2\tnsnames.ora里 ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 虚拟机IP)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) 5.添加一个环境变量,名为TNS_ADMIN,值为tnsnames.ora文件所在路径d:\instantclient_11_2\tnsnames.ora,plsql通过这个找到orcl连接字符串 6.添加一个环境变量NLS_LANG = SIMPLIFIED CHINESE_CHINA.ZHS16GBK 7.打开PLSQL,不用登陆,工具-首选项-ORACLE-连接: 勾选检查连接 Oracle主目录: d:\instantclient_11_2 OCI库: d:\instantclient_11_2\oci.dll 经过以上几步之后,重启PLSQL,问题来了,报错:ora-12541:TNS:无监听程序. ping是可以ping得通的,虚win7上的监听也开着.经过不懈的努力,多次试验终于解决了: 1.虚拟机网络选择桥接,并在虚拟机内网络连接IPV4设置静态IP IP地址:192.168.1.111 (111可修改成自己的 1-255) 子网掩码:255.255.255.0 默认风头:192.168.1.1 首选DNS服务器:192.168.1.1 修改完记得主win7上 ping 192.168.1.111 ping得通再继续往后.

oracle存储过程学习经典[语法实例调用]

Oracl e 存储过程学习 目录 Oracle 存储过程1 Oracle存储过程基础知识1 Oracle存储过程的基本语法2 关于Oracle存储过程的若干问题备忘4 1.在Oracle中,数据表别名不能加as。5 2.在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利用 游标的话就另当别论了。5 3.在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。5 4.在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错5 5.在存储过程中,关于出现null的问题5 6.Hibernate调用Oracle存储过程6 用Java调用Oracle存储过程总结6 一、无返回值的存储过程6 二、有返回值的存储过程(非列表)8 三、返回列表10 在存储过程中做简单动态查询11 一、本地动态SQL12 二、使用DBMS_SQL包14 Oracle存储过程调用Java方法16 Oracle高效分页存储过程实例17 Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

用PLSQL远程连接Oracle数据库

PL/SQL Developer 远程连接Oracle数据库 1、配置服务器tnsnames.ora文件,如果本机上没有安装oracle,可以从安 装了oracle的机上拷贝一个(tnsnames.ora文件)放在指定目录下,因为我已安装oracle,所以直接配置该文件。 # tnsnames.ora Network Configuration File: D:\Oracle11g\product\11.2.0\dbhome_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools. LISTENER_ORCL = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO) ) ) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.25.224)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) orcl为远程Oracle数据库的实例名,IP地址和端口也要配置正确。 2、配置完成后,Oracle客户端应该可以连接到远程Oracle 数据库上。

proc调用PLSQL方法

test.pc是proc程序,该程序嵌入PL/SQL 匿名块,该匿名块调用了存储过程。编译、链接、执行步骤: 1 预编译test.pc,产生test.c文件 C:\proc test.pc sqlcheck=semantics userid=system/system 2 编译、链接、执行 使用VC++6.0,对test.c编译、链接、执行

2012-02-17 23:1229人阅读评论(0)收藏举报2.嵌入plsql语句块。写一个存储过程和函数,在proc程序中调用create or replace procedure hellon(par_id number) is begin for abc in 1..par_id loop dbms_output.put_line('hello'); end loop; end; ----------------------------------- create or replace function getmax(par1 number,par2 number) return number is begin if par1>par2 then return par1; end if; return par2; end; ------------------------------------- set serveroutput on

3.语法: exec sql execute begin /*语句块*/ end; end-exec; -------------------------------------- proc test.pc 会报错PCC-S-02345,只要调用语句块,必须给 sqlcheck=semantics proc test.pc sqlcheck=semantics 还是不可以: 注意:如果调用语句块选项,就要跟一个选项:userid proc test.pc sqlcheck=semantics userid=system/system sqlcheck:按照semantics的标准去检查语法。 userid:按照userid给定的用户名密码去检查调用的存储过程和函数存不存在。你必须指定用户名和密码去,调东西,因为有可能这个不是你自己的数据库。所以给用户名

Oracle数据库远程连接设置的四种方法

Oracle数据库远程连接设置的四种方法 Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍。 第一种情况: 若oracle服务器装在本机上,那就不多说了,连接只是用户名和密码的问题了。不过要注意环境变 量%ORACLE_HOME%/network/admin/是否设置。 第二种情况: 本机未安装oracle服务器,也未安装oracle客户端。但是安装了pl sql development、toad sql development、sql navigator等管理数据库的工具。在虚拟机或者另一台电脑上安装了oracle服务器,也就是虚拟机或者另一台电脑此时作为服务器。 这种情况下,本人以pl sql development远程连接ORACLE服务端数据库为例: 1、在安装oracle服务器的机器上搜索下列文件: ?oci.dll ?ocijdbc10.dll ?ociw32.dll ?orannzsbb10.dll ?oraocci10.dll ?oraociei10.dll ?sqlnet.ora ?tnsnames.ora ?classes12.jar ?ojdbc14.jar 把这些找到的文件复制放到一个文件夹,如 oraclient,将此文件夹复制到客户端机器上。如放置路径为 D:oraclient。 2、配置tnsnames.ora,修改其中的数据库连接串。 1.oracledata = 2. 3.(DESCRIPTION = 4. 5.(ADDRESS_LIST = 6. 7.(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.58)(PORT = 1521)) 8. 9.(CONNECT_DATA =

PLSQL使用详细介绍

PL/SQL Developer使用指南 一、安装 PL/SQL Developer不需要执行安装程序,只要从其他机上copy一个来就可以使用。 二、登录 在使用PL/SQL Developer之前,首先需要在本机上配置数据库客户端(在oracle自带工具Net8Assistant中可配置)。配置完成后,在以下窗口中敲入用户名和密码就可进入PL/SQL Developer了。 进入PL/SQL Developer以后,会见到以下窗口: 在这里,可以对数据库中的任何对象(包括函数、存储过程、包、表、触发器等等)进行编辑、修改、运行等。(要视乎该用户的权限而定)。 如果用户要重新登录另一数据库,则可以按下“”重新输入本地数据库标识和用户及密码重新登录。

三、修改对象或编译存储过程 我们以存储过程为例: 双击菜单项“procedures”,按右键即可选择新建存储过程(new)或是修改存储过程(edit)等等。选择完毕后则用oracle的PL/SQL语句对存储过程进行编辑,在编辑完以后 按下可以对它进行编译,如果编译未通过,会在窗口中出现错误提示(如下图所示), 用户可根据提示进行修改和再次编译。 当完全编译通过后,用户可单击存储过程并按右键,选择“test”(执行存储过程),出现以下窗口:

在执行前,首先按“”进行调试,然后按“”执行该存储过程;如果用户在执行过程 中发生错误异常退出了,PL/SQL Developer会在窗口中显示错误,并提示退出。在发生错误后,用户可以选择在存储过程中添加“DBMS_OUTPUT.put_line(字符串)”语句来进行错 误跟踪或是通过一步步执行存储过程(按)来查看执行过程中数据的变化从而进行纠错。 除了存储过程之外,还可以通过PL/SQL Developer对数据库中的其他对象进行修改和授权,情况和以上存储过程的修改大同小异。 四、SQL语句的执行 如果用户要在oracle中执行sql语句,可以点击工具栏上的“new”()中的“SQL window”,这时会弹出一个sql语句的输入窗口,用户就可以在此窗口中敲入sql语句了。并按“F8”或是“”执行,执行后的结果会在下面显示出来,但默认情况下一次只能显 示一页,可以按“”显示下一页;如果用户需要显示全部,则可以按下“”;而按下 “”则可以输入查询条件。如下面两张图所示:

Oracle+PlSql存储过程 学习文档

Oracl e 存储过程 目录 Oracle 存储过程 (1) Oracle存储过程基础知识 (1) Oracle存储过程的基本语法 (2) 关于Oracle存储过程的若干问题备忘 (4) 1. 在Oracle中,数据表别名不能加as。 (4) 2. 在存储过程中,select某一字段时,后面必须紧跟into,如果select整个记录,利 用游标的话就另当别论了。 (5) 3. 在利用select...into...语法时,必须先确保数据库中有该条记录,否则会报出"no data found"异常。 (5) 4. 在存储过程中,别名不能和字段名称相同,否则虽然编译可以通过,但在运行阶段 会报错 (5) 5. 在存储过程中,关于出现null的问题 (5) 6. Hibernate调用Oracle存储过程 (6) 用Java调用Oracle存储过程总结 (6) 一、无返回值的存储过程 (6) 二、有返回值的存储过程(非列表) (8) 三、返回列表 (9) 在存储过程中做简单动态查询 (11) 一、本地动态SQL (12) 二、使用DBMS_SQL包 (13) Oracle存储过程调用Java方法 (16) Oracle高效分页存储过程实例 (17) Oracle存储过程基础知识 商业规则和业务逻辑可以通过程序存储在Oracle中,这个程序就是存储过程。 存储过程是SQL, PL/SQL, Java 语句的组合,它使你能将执行商业规则的代码从你的应用程序中移动到数据库。这样的结果就是,代码存储一次但是能够被多个程序使用。 要创建一个过程对象(procedural object),必须有CREATE PROCEDURE 系统权限。如果这个过程对象需要被其他的用户schema 使用,那么你必须有CREATE ANY PROCEDURE 权限。执行procedure 的时候,可能需要excute权限。或者EXCUTE ANY PROCEDURE 权限。如果单独赋予权限,如下例所示: grant execute on MY_PROCEDURE to Jelly 调用一个存储过程的例子: execute MY_PROCEDURE( 'ONE PARAMETER'); 存储过程(PROCEDURE)和函数(FUNCTION)的区别。

PLSQL连接oracle数据库配置

PLSQL连接oracle数据库配置 方法一: 1)点击Net Configuration Assistant 2) 在弹出的对话框中选择本地Net服务名配置,点下一步 3)在服务名配置对话框中选择添加,点下一步 4)在如下对话框中填写要访问的oralce数据库的服务名,该服务名可以通过oralce登录用户名进入环境,在.cshrc中,环境变量ORACLE_SID对应的值便是这个服务名,也可以在oracle用户环境下执行grep | env ORACLE_SID查找。 点击下一步 5)选择TCP协议,点下一步 6)主机名中填写要访问的oracle数据库服务器,使用标准端口号1521,点下一步 7)选中“是,进行测试”,点下一步 8) 点更改登录,填写要访问的数据库用户名和密码,确保其正确。此处主要是验证前面配置是否正确,如正确这里的测试就可以成功。 如果不正确请检查服务名、ip地址、用户名、密码中是否有写错,并改之,就可以成功了。 测试成功后点下一步 9)在下图中填写网络服务名,此处的网络服务名可以随意取名,点下一步,后面配置数据源的时候用的就是这个网络服务名 方法一用起来有点小复杂,不过可以了解数据库的配置步骤,方法二相对来说简单很多 找到本机oracle数据库安装的如下路径,如: F:\app\Administrator\product\11.1.0\client_1\network\admin,在该路径下有个文件tnsnames.ora,打开文件会发现里面有很多连接配置,直接拷贝一个修改如下红色字 SYSDB_102 = //对应的就是上面方法一提到的网络服务名 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.41.24.102)(PORT = 1521)) //访问数据库的ip

PLSQL Developer连接64位Oracle客户端设置

PLSQL Developer连接64位Oracle客户端设置 在64位操作系统机器上安装Oracle客户端和PL/SQL Developer成功后,使用PL/SQL Developer登录却不能成功,有如下提示: 其原因是PL/SQL Developer不能直接连接64位Oracle客户端,要解决该问题,需要进行如下设置: 安装Oracle64位客户端(本人安装的是10204_vista_w2k8_x64_production_client.zip),安装PL/SQL Developer(本人安装的是plsqldev804),具体安装步骤不在此具体说明。 配置PLSQL Developer: 第一步:下载instantclient-basic-win32-11.2.0.1.0.zip(其实是轻量级32位客户端,不需要安装),并将其解压放在Oracle客户端安装目录下,如下图: 注意:Oracle8i、Oracle9i客户端对应下载instantclient-basic-win32-10.x.x.x.x.zip,Oracle9i 以上版本需要下载instantclient-basic-win32-11.x.x.x.x.zip,否则运行PL/SQL Developer时会出现找不到部分文件的错误提示。 第二步:双击运行PL/SQL Developer,取消登录,直接进入主界面,在主界面中选择【工具】→【首选项(P)…】→【连接】,在该界面中填写Oracle主目录名为之前下载并放置的instantclient 所在路径,例如D:\oracle\instantclient_11_2,填写OCI库内容为instantclient文件夹下oci.dll 文件所在的路径,如:D:\oracle\instantclient_11_2\oci.dll。

在PLSQLDeveoper中创建存储过程和调用过程的例子

?例:创建一个存储过程(ADD_EMP_XX,XX是自己的学号最后2位) 要求: 1、该过程有4个输入参数,分别为v_empNo,v_eName,v_sal,v_hireDate。 2、其中v_eName缺省值为“UNKNOWN”,v_sal缺省值为2000。 3、根据参数值在emp表中插入一条数据。 方法1: CREATE OR REPLACE PROCEDURE ADD_EMP_06( v_hireDate in emp.hiredate%type, v_empNo in emp.empno%TYPE, v_sal in emp.sal%TYPE DEFAULT2000, v_name in emp.ename%type DEFAULT'UNKNOWN') is begin INSERT INTO emp(empno, ename, sal,hiredate) VALUES(v_empNo, v_Name, v_sal,v_hiredate); end; select*from user_errors begin ADD_EMP_06('2009/01/01',1000); end; 方法2 CREATE OR REPLACE PROCEDURE BDD_EMP_06 is v_hireDate emp.hiredate%type:='1990/10/01'; v_empNo emp.empno%TYPE:=1225; v_sal emp.sal%TYPE DEFAULT2000; v_name emp.ename%type DEFAULT'HJJJJ'; begin INSERT INTO emp(empno, ename, sal,hiredate) VALUES(v_empNo, v_Name, v_sal,v_hiredate); end; begin BDD_EMP_06(); end;

plsql使用技巧详解

plsql使用技巧详解 1.记住登陆密码 为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码;设置方法: PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History ,“Store history”是默认勾选的,勾上“Store with password”即可,重新登录在输入一次密码则记住了; 2.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的用户是dba,要展开tables 目录,正常情况都需要Wait几秒钟,而选择My Objects后响应速率则是以毫秒计算的。 设置方法: Tools菜单 --> Brower Filters,会打开Brower Folders的定单窗口,把“My Objects”设为默认即可。 Tools菜单--Brower Folders,中把你经常点的几个目录(比如:Tables Views Seq Functions Procedures)移得靠上一点,并加上颜色区分,这样你的平均寻表时间会大大缩短。 3.类SQL PLUS窗口 File->New ->Command Window 这个类似于oracle的客户端工具sql plus,但用比它好用多了; 4.关键字自动大写 Tools->Preferences->Editor,将Keyword case选择Uppercase。这样在窗口中输入sql语句时,关键字会自动大写,而其它都是小写。这样阅读代码比较容易,且保持良好得编码风格,同理,在 Tools->Preferences->Code Assistant里可以设置数据库对象的大写、小写,首字母大写等。 5.查看执行计划 选中需要分析的SQL语句,然后点击工具栏的Explain plan按钮(即执行计划),或者直接按F5;这个主要用于分析SQL语句执行效率,分析表的结构,便于为sql调优提供直观依据。 6.使用自定义快捷键 PL/SQL Developer也可以像其他IDE那样使用自定义快捷键提高编写代码效率,节省时间。 如我们平时在sql窗口中使用最频繁的 select * from 我们就可以设置一个快捷键来简化select * from的输入。 1)。建立一个文本文件shortcuts.txt,并写入如下内容: s = SELECT * FROM sc = SELECT count(*) FROM 复制代码另存到PL/SQL Developer的安装路径下的~/PlugIns目录下 2)。Tools-->Preferences-->User Interface-->Editor-->AutoReplace,选中Enable复选框,然后浏览文件选中之前创建的shortcuts.txt,点击Apply 3)。重启PL/SQL Developer,在sql窗口中输入s+空格,sc+空格做测试 7.执行单条SQL语句 PL/SQL Developer 7.1.2 -->tools->Preferences-->Window types ,勾上“AutoSelect Statement”。在使用 PL/SQL Developer的SQL Window时,按F8键,PL/SQL Developer默认是执行该窗口的所有SQL语句,需要设置为鼠标所在的那条SQL语句,即执行当前SQL语句。 8.PL/SQL Beautifier(PL/SQL 美化器)

PLSQL使用方法

1.1PLSQl远程连接oracle数据库 1.1.1配置tnsnames.ora 路径:X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client\tnsnames.ora tnsnames.ora配置: orcl = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) ) (CONNECT_DATA = (SID = orcl) ) ) 其中HOST为主机IP地址,红色字体处 PORT为oracle开放端口号 SERVICE_NAME为连接数据库名字,蓝色字体处 *此配置参数可以配置多个,也就是可以配置多个连接字符串(全局名称) 1.1.2添加连接环境变量 变量名:TNS_ADMIN 变量值:X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client 1.1.3添加ORACLE的语言环境变量: 变量名:NLS_LANG 变量值:AMERICAN_AMERICA.ZHS16GBK(设置ORACLE的语言) 重新连接,即可正常显示中文。 如果想转换为UTF8字符集,可以赋予"NLS_LANG"为"AMERICAN_AMERICA.UTF8",其他编码同上

1.1.4下载并安装PL.SQL.Developer,配置应用: 配置tools->preferences->connection PLSQL 设置 Oracle Home=X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client OCI library=X:\XXX\PLSQL Developer 9.0.0.1601\orcl_client\oci.dll 1.1.5重启plsql 再次打开plsql则会在database中有oracledata选项输入用户名密码就可以登陆。 1.2导入基础数据 1.2.1输入用户名密码登录plsql

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)。 CreateParameter 方法 创建具有指定属性的新的Parameter 对象。 语法 Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value) 返回值

相关文档
最新文档