当前位置:首页 » 存储配置 » 调用oracle存储过程返回数据

调用oracle存储过程返回数据

发布时间: 2022-07-09 02:38:49

1. oracle 通过调用存储过程,得到数据集

我也是初学者,不是什么高手,根据我的理解提出我的看法,仅供参考:
(1)函数function的参数必须都是in类型的,必须要有返回值
它可以被sql语句或者存储过程调用
例如:
--定义一个函数,返回传入的参数本身
create or replace function TestFunOne(argsOne in varchar2) return varchar2 is
resultStr varchar2(500);
begin
resultStr := argsOne;
return(resultStr);
end TestFunOne;

sql语句中可以这样用: update tableName t set t.columnName = TestFunOne('1')
存储过程中可以这样用:
create or replace procere getNameByFincode(inputStr in varchar2,
resultStr out varchar2) is

begin
resultStr := TestFunOne(inputStr);
end getNameByFincode;

(2)java程序中一般是直接执行sql语句或者调用存储过程
java执行sql语句可以这样:
String sql="update tableName t set t.columnName = TestFunOne('1')";
stmt.executeUpdate(sql);

java中调用存储过程可以这样:
CallableStatement callStmt = connection.prepareCall("call getNameByFincode(?,?)");

以上都是最简单的例子,具体展开网上也都可以查阅,希望能解决你的问题O(∩_∩)O~

2. oracle存储过程中调用带返回参数的存储过程

1、return返回值类型:
declare v_return_value number;
v_return_value := spname();
dbms_output.putline(v_return_value);
2、out返回
declare v_return_value number;
spname(:v_return_value);
dbms_output.putline(v_return_value);

3. 如何在Delphi中调用oracle的存储过程返回数据集

转:
一.创建包与包体

1.附:建表aaclass为下面作测试用

create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );

INSERT INTO aaclass values('c1', 'cn1', 10 ) ;
INSERT INTO aaclass values('c2', 'cn2', 40 ) ;
INSERT INTO aaclass values('c1', 'cn3', 30 ) ;
commit;

2.建包:

CREATE OR REPLACE PACKAGE PKG_JCCTEST1
AS

type rc_class is ref cursor;

--求p1,p2的和与差,返回的多个值通过游标返回
procere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class);

--查询满足条件的数据集,返回数据集通过游标返回
procere GetClass2(a in number,ResultCursor out rc_class ) ;

--往表中插一条记录,不返回结果集时,本人用AdoQuery调用(adodataset好象要求必须返回结果集)
procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number) ;
end PKG_JCCTEST1;

3.建包体

CREATE OR REPLACE PACKAGE BODY PKG_JCCTEST1
AS

procere GetSubAndSum2(p1 number,p2 number ,
ResultCursor out rc_class)
IS
BEGIN
open ResultCursor for
select p1-p2 as "sum", p1+p2 as "sub" from al;
END ;

procere GetClass2(a in number,ResultCursor out rc_class )
is
begin

open ResultCursor for
select aaclass.* from aaclass where pnumber >a;

end ;

procere InsertClass( p_cid varchar2 ,p_cname varchar2 ,
p_pnumber number)
is
begin
insert into aaclass values(p_cid,p_cname,p_pnumber) ;
-- commit;
end ;

二.在delphi中利用AdoDataSet调用上述第一个存储过程
1.利用AdoConnection1连接数据库(驱动为 oracle Provider for OLE DB),
**并在连接字符串中加入这一节: PLSQLRSet=1; 如下所示:
Provider=OraOLEDB.Oracle.1;Password=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=1

2.在窗体上加AdoDataSet1 指明连接为上述AdoConnection1,下面可以放一个按钮,单击按钮就能调用第一步中创建的包过程,并返回数据集。代码如下所示:

procere TForm1.Button1Click(Sender: TObject);
var
AResult , BResult : integer;
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ;

//***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带三个参数,我们这里只需要传两个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ;

//***C 顺序有关,createparam必须放在commandtext赋值语句之后.

// 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,45为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);
//创建第二个参数,根据createparameter的顺序 自动与call中的第二个参数对应
ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4);

//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ;

//根据存储过程,数据集只有一条记录,所以不需要用while do 来遍历数据集,直接取数据了

//此处的字段名根据包过程中的返回游标 对应的字段名来取
//定义的存储过程返回游标如: open ResultCursor for
// select p1-p2 as "sum", p1+p2 as "sub" from al;
//把对应的字段值取出来即可
AResult := ADODataSet1.Fields.FieldByName('sub').Value ;
BResult := ADODataSet1.Fields.FieldByName('sum').Value ;

//显示结果
showmessage(inttostr(AResult)) ;
showmessage(inttostr(BResult)) ;

end;

三.在delphi中利用AdoDataSet调用上述第二个存储过程

还是利用上述的AdoDataSet1来调用第二个存储过程,无需任何改动,加第二个按钮,单击时代码如下:

procere TForm1.Button2Click(Sender: TObject);
begin
ADODataSet1.Close ;
ADODataSet1.CommandType := cmdText ;
ADODataSet1.Parameters.Clear ;

//***利用call方法调用oracle过程时,参数必须由?来传, 即使你要传的参数为常理
//输出游标的参数不需要指定!!!!!!,本来此函数带两个参数,我们这里只需要传一个参数.
ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ;

//***C 顺序有关,createparam必须放在commandtext赋值语句之后.

// 创建第一个参数,对应call中的第一个?,ftinteger为类型,10为长度,20为传入的实参值
ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);

//下面调用ADODataSet1 的open方法,返回数据集(对应包过程的游标)
ADODataSet1.Open ;

while not ADODataSet1.Eof do
begin
showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +
'--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +
'--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)
) ;
ADODataSet1.Next ;
end ;
end;

四 利用adoquery调用第三个过程,不返回数据集的

procere TForm1.Button3Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ;

AdoQuery1.SQL.Clear ;

AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;
AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ;

AdoQuery1.ExecSQL ;
end;

五 利用adoquery调用第一个过程,返回数据集的.

procere TForm1.Button4Click(Sender: TObject);
begin
AdoQuery1.Close ;
AdoQuery1.Parameters.Clear ;

AdoQuery1.SQL.Clear ;

AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;
AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ;

AdoQuery1.Open ;

Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+
string( AdoQuery1.FieldByName('sum').Value));
end;

六.关于三层体系的此类问题

两层的解决了,三层类似.
中间层用tadodataset 或tadoquery (+tdatasetprovider),中间层的adoconnection的连接字符串加上plsqlRset=1;
客户端用clientdataset ,大同小异,举例如下:

begin
//调用相应的过程
ClientDataSet1.Close ;
ClientDataSet1.Params.Clear ;

ClientDataSet1.CommandText := '{call PackageName.ProcereName(?,?)}' ;
ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;
ClientDataSet1.Open ;

end ;

4. oracle存储过程怎么返回结果集

你这不是已经写好了嘛。
外层调用程序只要声明变量mycursor并且作为参数传到emp_pro存储过程中,执行结束后就可以使用了。

5. 怎么用C#调用ORACLE存储过程来返回字符串

首先你的
存储过程
返回值
是靠tmpname
in
out
varchar2这个out参数返回的,你用string
a
=接受返回值是错误的
其次对于out类型的参数在传参的时候要指明参数方向

6. oracle存储过程可以返回内容吗

可以的。
返回一个游标社!
有俩种方法:
一种是声明系统游标,一种是声明自定义游标,然后后面操作一样,参数类型为
in out 或out
(1)声明个人系统游标.(推荐)
create or replace p_temp_procere
(
cur_arg out sys_refcursor; --方法1
)
begin
open cur_arg for select * from tablename;
end
调用
declare
cur_calling sys_refcursor;
begin
p_temp_procere(cur_calling); --这样这个游标就有值了
for rec_next in cur_calling loop
....
end loop;
end;

7. Oracle通过存储过程如何正确返回数据集

typeFuxjResultSetisrefcursor; 还可以定义其他内容 endFuxjPackage; 再定义Oracle存储过程: (sDMinchar,sMCinchar,pRecCurinoutFuxjPackage.FuxjResultSet)asbeginupdatefuxjExamplesetmc=sMCwheredm=sDM;ifSQL%ROWCOUNT=0thenrollback;openpRecCurfor select'0'resfromal;elsecommit;openpRecCurfor select'1'resfromal;endif;end;和 (sDMinchar,sMCinchar,pRecCurinoutFuxjPackage.FuxjResultSet)asbegininsertintoFuxjExample(dm,mc)values(sDM,sMC);commit;openpRecCurfor select*fromFuxjExample;end;二、在Delphi中调用返回数据集的Oracle存储过程 可以通过TstoredProc或TQuery控件来调用执行返回数据集的存储,数据集通过TstoredProc或TQuery控件的参数返回源码天空 ,注意参数的DataType类型为ftCursor,而参数的ParamType类型为ptInputOutput。 使用TstoredProc执行UpdatefuxjExample的相关设置为: objectStoredProc1:TStoredProc

8. 在Oracle存储过程中查询的数据结果怎样返回

oracle
跟ms不一样。
要返回表的记录数据,只能通过游标,或者自定义对象数组在存储过程中组装好后返回。

9. C#调用oracle存储过程返回数据集

///<summary>
///执行存储过程
///</summary>
///<paramname="storedProcName">存储过程名</param>
///<paramname="parameters">存储过程参数</param>
///<paramname="tableName">DataSet结果中的表名</param>
///<returns>DataSet</returns>
publicstaticDataSetRunProcere(stringstoredProcName,IDataParameter[]parameters,stringtableName)
{
using(OracleConnectionconnection=newOracleConnection(connectionString))
{
DataSetdataSet=newDataSet();
connection.Open();
OracleDataAdaptersqlDA=newOracleDataAdapter();
sqlDA.SelectCommand=BuildQueryCommand(connection,storedProcName,parameters);
sqlDA.Fill(dataSet,tableName);
connection.Close();
returndataSet;
}
}
///<summary>
///构建OracleCommand对象(用来返回一个结果集,而不是一个整数值)
///</summary>
///<paramname="connection">数据库连接</param>
///<paramname="storedProcName">存储过程名</param>
///<paramname="parameters">存储过程参数</param>
///<returns>OracleCommand</returns>
(OracleConnectionconnection,stringstoredProcName,IDataParameter[]parameters)
{
OracleCommandcommand=newOracleCommand(storedProcName,connection);
command.CommandType=CommandType.StoredProcere;
foreach()
{
command.Parameters.Add(parameter);
}
returncommand;
}

热点内容
班级采访问题 发布:2024-10-09 04:45:44 浏览:497
单人地图脚本 发布:2024-10-09 04:45:32 浏览:754
易语言cf自瞄源码 发布:2024-10-09 04:36:14 浏览:121
安卓和苹果哪个更难修理 发布:2024-10-09 04:36:12 浏览:26
黎明觉醒安卓什么配置 发布:2024-10-09 04:32:05 浏览:127
助手autojs脚本 发布:2024-10-09 04:31:40 浏览:186
sql判断今天 发布:2024-10-09 04:19:35 浏览:943
拆分视频需要哪些配置 发布:2024-10-09 04:06:39 浏览:912
安装电脑网络需要哪些配置 发布:2024-10-09 03:57:28 浏览:963
风云城服务器ip地址 发布:2024-10-09 03:53:18 浏览:635