关于调用Oracle存储过程返回数据集的问题,请大家指教

xiongda 2008-09-26 08:57:39
加精
我在用dbExpress调用Oracle的存储过程返回数据集时遇到了奇怪的问题,请各位高手指教。
调试过程与现象如下:
1.建立包:
Create Or Replace Package ChargePKG
As
Type ChargeCursor Is REF Cursor;
End ChargePKG;
2.当存储过程为
Create Or Replace Procedure GetCarSortChargeData(Dep VARCHAR2,
ClassNO VARCHAR2,
MorningShiftOnDuty VARCHAR2,
MorningShiftOffDuty VARCHAR2,
MiddleShiftOnDuty VARCHAR2,
MiddleShiftOffDuty VARCHAR2,
NightShiftOnDuty VARCHAR2,
NightShiftOffduty VARCHAR2)
Is
Begin
Insert Into TempGratisCarTable(CarID,CarTpye,CriterionWeight,WholeWeight) Values(1,2,3,4);
End GetCarSortChargeData;
时,执行“SQLStoredProc1.ExecProc;”正常
3.当存储过程为
Create Or Replace Procedure GetCarSortChargeData(Dep Number,
ClassNO Number,
MorningShiftOnDuty VARCHAR2,
MorningShiftOffDuty VARCHAR2,
MiddleShiftOnDuty VARCHAR2,
MiddleShiftOffDuty VARCHAR2,
NightShiftOnDuty VARCHAR2,
NightShiftOffduty VARCHAR2)
Is
Begin
Insert Into TempGratisCarTable(CarID,CarTpye,CriterionWeight,WholeWeight) Values(1,2,3,4);
End GetCarSortChargeData;
时(即包既具有数字型输入变量,又具有字符串型输入变量),执行“SQLStoredProc1.ExecProc;”时提示“BCD overflow”错误。
4.将存储过程改为
Create Or Replace Procedure GetCarSortChargeData(Dep VARCHAR2,
ClassNO VARCHAR2,
MorningShiftOnDuty VARCHAR2,
MorningShiftOffDuty VARCHAR2,
MiddleShiftOnDuty VARCHAR2,
MiddleShiftOffDuty VARCHAR2,
NightShiftOnDuty VARCHAR2,
NightShiftOffduty VARCHAR2,
CarSortChargeCursor Out ChargePKG.ChargeCursor)
Is
Begin
Insert Into TempGratisCarTable(CarID,CarTpye,CriterionWeight,WholeWeight) Values(1,2,3,4);
Open CarSortChargeCursor For Select * From TempGratisCarTable;
End GetCarSortChargeData;
时(即在输入变量均为字符串型变量的基础上,增加了游标型输出变量),执行“SQLStoredProc1.Open;”时提示如下错误
ORA-06550:第1行,第1列;
PLS-00306:调用'GetCarSortChargeData'时参数个数或类型错误
ORA-06550:第1行,第1列;
PLS-00306:调用'GetCarSortChargeData'时参数个数或类型错误
ORA-06550:第1行,第1列;
PL/SQL:Statement ignored.
请大侠门指教是怎么回事?是dbexpress的bug吗?
...全文
2365 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigboss1943 2008-10-04
  • 打赏
  • 举报
回复
关注
lcjabc2000 2008-09-28
  • 打赏
  • 举报
回复
高手如云啊 顶一下
SlaughtChen 2008-09-28
  • 打赏
  • 举报
回复
关注一下啦
jkd5170 2008-09-28
  • 打赏
  • 举报
回复
18L
正解!!
用到Cursor
就应该在包里进行定义!
痴人说梦2013 2008-09-27
  • 打赏
  • 举报
回复
学习了
solaker 2008-09-27
  • 打赏
  • 举报
回复
mark
xiongda 2008-09-27
  • 打赏
  • 举报
回复
To unsigned:
我试过了,还是不行,错误提示是“Access violation at address 05F91A09 in module 'dbexpora.dll',write of address 00000000”。
yeah920 2008-09-27
  • 打赏
  • 举报
回复
帮忙顶一下
xiongda 2008-09-27
  • 打赏
  • 举报
回复
非常感谢unsigned。我再试试。
JeffChung 2008-09-27
  • 打赏
  • 举报
回复
mark,学习
hongqi162 2008-09-27
  • 打赏
  • 举报
回复
9i你直接使用sys_refcursor就可以不需要自己定义动态游标
僵哥 2008-09-27
  • 打赏
  • 举报
回复
1,2不有测试
3正常
4异常:
[Quote]ORA-06550:第1行,第7列:
PLS-00306:调用'GETCARSORTCHARGEDATA'时参数个数或类型错误
ORA-06550:第1行,第7列:
PL/SQL:Statement ignored
[/Quote]

改为下面的代码后,4正常:
Create Or Replace Package ChargePKG 
As
Type ChargeCursor Is REF Cursor;
Procedure GetCarSortChargeData(Dep VARCHAR2,
ClassNO VARCHAR2,
MorningShiftOnDuty VARCHAR2,
MorningShiftOffDuty VARCHAR2,
MiddleShiftOnDuty VARCHAR2,
MiddleShiftOffDuty VARCHAR2,
NightShiftOnDuty VARCHAR2,
NightShiftOffduty VARCHAR2,
CarSortChargeCursor Out ChargeCursor) ;
End ChargePKG;
/
CREATE OR REPLACE PACKAGE BODY ChargePKG AS
Procedure GetCarSortChargeData(Dep VARCHAR2,
ClassNO VARCHAR2,
MorningShiftOnDuty VARCHAR2,
MorningShiftOffDuty VARCHAR2,
MiddleShiftOnDuty VARCHAR2,
MiddleShiftOffDuty VARCHAR2,
NightShiftOnDuty VARCHAR2,
NightShiftOffduty VARCHAR2,
CarSortChargeCursor Out ChargeCursor)
Is
Begin
Insert Into TempGratisCarTable(CarID,CarTpye,CriterionWeight,WholeWeight) Values(1,2,3,4);
Open CarSortChargeCursor For Select * From TempGratisCarTable;
return;
End GetCarSortChargeData;
END ChargePKG;


僵哥 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 xiongda 的回复:]
感谢unsigned:
恐怕不能用ADOConnection+ADOStoredProc了,我要移植到Kylix下。
[/Quote]
我的意思是让你试一下看是否是环境存在问题.也可以试一下ODAC
xiongda 2008-09-27
  • 打赏
  • 举报
回复
感谢unsigned:
恐怕不能用ADOConnection+ADOStoredProc了,我要移植到Kylix下。
僵哥 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 xiongda 的回复:]
谢谢unsigned。看来是DBExpress组件的问题了。
[/Quote]
要不你试一下使用ADOConnection+ADOStoredProc.为存储过程增加参数的时候,忽略掉ref cursor.
xiongda 2008-09-27
  • 打赏
  • 举报
回复
谢谢unsigned。看来是DBExpress组件的问题了。
僵哥 2008-09-27
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 xiongda 的回复:]
To unsigned:
我试过了,还是不行,错误提示是“Access violation at address 05F91A09 in module 'dbexpora.dll',write of address 00000000”。
[/Quote]
这个可能跟你的DBExpress组件有关系.

实际上DBExpress4当中非IDE设计期无法刷出存储过程的参数.翻了一下CodeGear的QC,二月份就有人提出来有问题了,但是一直是Open状态.
kuangerzhai 2008-09-27
  • 打赏
  • 举报
回复
虽然不懂,但也帮忙顶一下下咯!
xiongda 2008-09-26
  • 打赏
  • 举报
回复
请问这个补丁在什么地方有下载?
fangsp 2008-09-26
  • 打赏
  • 举报
回复
d7的话需要打一个sp1的补丁
这是一定的
加载更多回复(15)

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧