“桃花影落飞神剑”之二--各位FW请进:ADOStoredProc怎么才能得到Oracle存储过程的返回值?(300)有旧帖。(300分)

J

jrq

Unregistered / Unconfirmed
GUEST, unregistred user!
各位好:
现在的问题是:ADOStoredProc怎么才能得到Oracle存储过程的返回值?
ADOStoredProc能不能用ftCursor?

旧帖的讨论如下,我仔细看了一遍,但是仍问题多多:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=0515742
http://www.delphibbs.com/delphibbs/dispq.asp?lid=559387
http://www.delphibbs.com/delphibbs/dispq.asp?lid=595956
---------------------------------------
来自:ggqq, 时间:2001-10-16 12:53:00, ID:675529
create or replace package spm
is
TYPE rctl IS REF CURSOR;
procedure proc1(aa number,bb number,rc1 in OUT rctl);
END;

create or replace package body spm
as
procedure proc1(aa number,bb number,rc1 in OUT rctl)
AS
BEGIN
OPEN rc1 FOR SELECT * FROM test;
END;
end;

另外,很重要的是,ADO的连接里面[red]一定要加上[/red]Extended Properties="PLSQLRSet=1"这一句
哎,当时我话了多少心血才得到的答案[:(][:(],现在就这么给了你了。[?]
就当大家交流交流吧![8D]
程序里这样:AdoStoredProc1.open;就可以得到返回的结果集,对AdoStoredProc1和adoquery一样的操作。
-------------------------------------------------lid=595956
我按照 ggqq大侠所说的进行了设置,但是ADOStoredProc仍不能得到返回值。
------------------------------------
为什么我在设置 返回参数 RESULTDATA =ftCursor 时, Delphi6提示:“变量或者类型不正确,或者不在可以接受的范围之内”。
我怎么也设置不成 ftCursor !!---lid=559387
 
》》》ADO的连接里面[red]一定要加上[/red]Extended Properties="PLSQLRSet=1"这一句
我已经加上了,问题却依然。 [:(] 因为前面的程序都是用ADO的,现在如改换不用ADO,则需改动的地方太多了。[:(]
请各位帮助。
 
先问一个,你的ado是哪个版本的,兄弟.
 
我没有升过级,就是系统自带的。
升级包哪里有下啊? 现在最新的是mdac几?

http://www.delphibbs.com/delphibbs/dispq.asp?lid=0515742中楼主说:
----
上述过程在BDE中可以正确执行,但在ADO的存储过程中,当参数CUR1 被赋予ftcursor
变量类型时出错,难道ADO在存储过程中不支持游标(cursor)数据类型?本人用ADO 的升级
包 d5ado_upgrade.exe升级以后还是不行。
各位可以试一试,谢谢!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=759393
好像解决问题了的,我也认为使用for oracle的ado是最好的,用
ms的ado for oracle也有解决的办法了.

//mdac最新版本是2.7的.你上面说的Extended Properties="PLSQLRSet=1"
是oracle自己公司出的ado中支持.
 
好象这是AdoStoredProc控件的BUG,改成AdoDATASET就行了。(AdoStoredProc1在操作
Oracle数据库的存储过程时不能通过。)
SQL SERVER就没问题。。。
 
我认为用adoStoredProc是不行的
原因可能是oracle的provider不支持CommandType为cmdStoredProc的执行方式
参考http://otn.oracle.com/docs/tech/windows/ole_db/doc/html/using.htm#1000470
都是用cmdText方式执行的
 
就期待着高人的出现呢。 终于来啦。
to wumeng 大侠:
AdoStoredProc操作Oracle数据库的“不返回数据”的存储过程(如insert、delete)能通过的。
我的已经实现了。可当操作“返回数据的”的存储过程(select)就有问题了。
AdoDATASET我还没有用,不过我今天试一试。 多谢您的关注。
to 沉香屑大侠:
早就在旧帖上看到您的关于这个问题的回复了。
也许您看过这个帖子了: http://www.delphibbs.com/delphibbs/dispq.asp?lid=1315012
我在线呼叫您,大概没有成功。
----
来自:沉香屑, 时间:2002-9-11 20:32:00, ID:1319463
用TADODataSet调用
格式是这样的:
'{call reg.emp:)param1, :param2.......)}'
----这个我也看了,是类似于在SQL/Plus中的写法。
我今天就用TADODataSet试试。

还希望您2位大侠继续关注。多谢。多谢!
 
沉香屑 (2002-5-24 12:19:00)
例如查询scott下面的emp
1.建包,定义游标类型和过程
create or replace Package pkg_demo
AS
TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
procedure open_emp_cv(emp_cv OUT EmpCurTyp);
END pkg_demo;
2。定义包体
create or replace package body pkg_demo
AS
procedure open_emp_cv (emp_cv OUT EmpCurTyp)
IS
BEGIN
OPEN emp_cv FOR SELECT * FROM emp;
END open_emp_cv;
end pkg_demo;
3。建立ado连接,注意用oracle的provider,连接字符串里包含“PLSQLRSet=1”
ADOConnection1.ConnectionString:='PLSQLRSet=1;Provider=OraOLEDB.Oracle;Password=tiger;Persist Security Info=True;User ID=scott;Data Source=fjddmis;Extended Properties=""';
ADOConnection1.Open;
4。用TADODataset调用存储过程,注意调用格式
ADODataSet1.Connection:=ADOConnection1;
ADODataSet1.CommandText:='{call pkg_demo.open_emp_cv}';
ADODataSet1.CommandType:=cmdText;
ADODataSet1.Open;
------------------------ 这是 沉香屑 大侠在lid=1107306中的回答。很经典。
 
http://otn.oracle.com/docs/tech/windows/ole_db/doc/html/using.htm#1000470 如是说:
---------------------------
Stored Procedures
When executing an Oracle PL/SQL stored procedure using a command, use Oracle native syntax or the ODBC procedure call escape sequence in the command text:

Oracle native syntax: BEGIN credit_account(123, 40); END;

ODBC syntax: {CALL credit_account(123, 40)}

Preparing Commands
OraOLEDB validates and fetches the metadata only for SELECT SQL statements.
---------------------------------------
Multiple Rowsets
OraOLEDB supports returning more than one rowset from a stored procedure. Consumers can use this feature to access all the REF CURSORs being returned by a stored procedure.

Example: Stored Procedure Returning Multiple Rowsets
PL/SQL Package
CREATE OR REPLACE PACKAGE Employees AS
TYPE empcur IS REF CURSOR;

PROCEDURE GetEmpRecords(p_cursor OUT empcur,
q_cursor OUT empcur,
indeptno IN NUMBER,
p_errorcode OUT NUMBER);

FUNCTION GetDept(inempno IN NUMBER,
p_errorcode OUT NUMBER)
RETURN empcur;
END Employees;

CREATE OR REPLACE PACKAGE BODY Employees AS

PROCEDURE GetEmpRecords(p_cursor OUT empcur,
q_cursor OUT empcur,
indeptno IN NUMBER,
p_errorcode OUT NUMBER) IS
BEGIN
p_errorcode := 0;
OPEN p_cursor FOR
SELECT *
FROM emp
WHERE deptno = indeptno
ORDER BY empno;

OPEN q_cursor FOR
SELECT empno
FROM emp
WHERE deptno = indeptno
ORDER BY empno;

EXCEPTION
WHEN OTHERS THEN
p_errorcode:= SQLCODE;

END GetEmpRecords;

FUNCTION GetDept(inempno IN NUMBER,
p_errorcode OUT NUMBER)
RETURN empcur IS
p_cursor empcur;
BEGIN
p_errorcode := 0;
OPEN p_cursor FOR
SELECT deptno
FROM emp
WHERE empno = inempno;
RETURN (p_cursor);

EXCEPTION
WHEN OTHERS THEN
p_errorcode:= SQLCODE;

END GetDept;

END Employees;
 
哈! 折腾了几天了。今天中午终于将这个问题搞定! 很高兴。 感觉自己学了东西,有所进步。
爽快,痛快! 欣喜之情难言于表。

对上面诸位富翁深表感谢。

现在上来送分表示祝贺,并胡乱填了首不成调的长短句以示感悟和纪念:

《 蝶 恋 花 》

*编程感悟*

苦想冥思郁闷满,
求医问药,
尝试千万遍。
新帖旧帖仔细看,
潇潇微雨夜色晚。

自量不能方寸乱,
混沌懵然,
谁知深和浅?
等到事后语诸君:--
三层两层难亦然。
 
我就省得麻烦计算了,公平均摊。

再次对各位的指导表示感谢!! 多谢!
 
惭愧,我不该得分的,兄弟太客气了,两年老兄吃亏了.
 
分数我不在乎的,关键是能解决问题。
 
to 沉香屑
我是delphi 的初学者,有以下问题:
1 oracle oledb for oracle 在哪里可以找到?
2 我按你的提示一步一步试做时,当我avtive adodataset1时,为何会报“调用‘open_emp_cv'时变量或数据类型出错”?难道一定只能在程序中通过语句open 吗?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2621391

来自:不知道_0909, 时间:2004-5-24 9:28:24, ID:2624045
解决了,谢谢
procedure TForm1.Button1Click(Sender: TObject);
begin
try
with ADOConnection1 do
begin
ConnectionString:=
'Provider=OraOLEDB.Oracle.1;'
+ 'Password=tiger;'
+ 'Persist Security Info=True;'
+ 'User ID=scott;'
+ 'Data Source=orcl;'
+ 'Extended Properties="PLSQLRSet=1;"';
Open;
end;
except
showMessage('连接不成功');
exit;
end;

try
with ADOStoredProc1 do
begin
Connection := ADOConnection1;
Parameters.Clear;
ProcedureName:= 'pkg_demo.open_emp_cv';
//Parameters.CreateParameter('p1',ftInteger,pdInput,10,1);
Open;
end;
except
showMessage('无法执行过程.');
end;
end;
 
顶部