传递数组类型给ORACLE存储过程问题!!!

国风 2007-01-17 12:31:48
delphi按钮事件:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
sInmsg, sOutmsg: OleVariant;
sErrMsg: string;
i, iRes: integer;
begin
try
if not ADOConnection1.Connected then
ADOConnection1.Connected := True;
sInmsg := VarArrayCreate([1, 4000], varVariant);
for i:=1 to 4000 do
begin
sInmsg[i] := '1';
end;
ADOStoredProc1.ProcedureName := 'MYPACK.OraMyArrayTest';
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.CreateParameter('Sinmsg',ftVariant,pdInput,4000,sInmsg);
ADOStoredProc1.Parameters.CreateParameter('Soutmsg',ftVariant,pdOutput,4000,sOutmsg);
ADOStoredProc1.Parameters.CreateParameter('SErrMsg',ftString,pdOutput,3000,'');
ADOStoredProc1.Parameters.CreateParameter('iRes',ftInteger,pdOutput,2000,0);
ADOStoredProc1.ExecProc;
iRes := ADOStoredProc1.FieldValues['iRes'];
sErrMsg := ADOStoredProc1.FieldValues['SErrMsg'];
if iRes <> 0 then
ShowMessage(sErrMsg)
else
ShowMessage(sOutmsg);
ADOConnection1.Connected := False;
except
on e: Exception do
begin
edit1.Text := e.Message;
ADOConnection1.Connected := False;
exit;
end;
end;
end;

ORACLE存储过程:
Type Myarray Is Table Of Varchar2(4000) Index By Binary_Integer;
procedure OraMyArrayTest(Sinmsg In Myarray,
Soutmsg Out Myarray,
SErrMsg Out Varchar2,
Ires Out Integer) is
begin
Ires:=-1;
Soutmsg := Sinmsg;
sErrMsg := 'OK';
Ires := 0;
end;

调试时报以下错误:
多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。
请高手指点.......
...全文
561 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongqi162 2007-01-17
  • 打赏
  • 举报
回复
你再找找别的驱动试试


http://pierce.cnblogs.com/archive/2006/02/10/328070.html


你去看看他说的那个驱动

国风 2007-01-17
  • 打赏
  • 举报
回复
以前也是你说的方式做的,但存储过程是其他部门写的,为了减少他们的工作量,解析这步在程序里做完.现在要有一个理由让领导知道,这个方法不行~^_^
hongqi162 2007-01-17
  • 打赏
  • 举报
回复
我感觉在你传入一个固定格式的字符串,然后在oracle写一个函数来解析你的字符串返回一个数组,这个方法不错,ado似乎不支持这样的参数传递方式(瞎说的,没有科学依据 :) )
国风 2007-01-17
  • 打赏
  • 举报
回复
要写一个通用的存储过程,每个交易的参数个数都不定的,所以要定义一个数组传.谢谢大家了
国风 2007-01-17
  • 打赏
  • 举报
回复
公司要求实现这个,我也没办法~
hongqi162 2007-01-17
  • 打赏
  • 举报
回复
为什么有这个需求,不可以用其他的参数形式解决吗?
hongqi162 2007-01-17
  • 打赏
  • 举报
回复
恩,我也试了一下,不可以
国风 2007-01-17
  • 打赏
  • 举报
回复
ADOStoredProc1.Parameters.CreateParameter('Sinmsg',ftArray,pdInput,4000,sInmsg);
ADOStoredProc1.Parameters.CreateParameter('Soutmsg',ftArray,pdOutput,4000,sOutmsg);

不正常地定义参数对象。提供了不一致或不完整的信息。
yi10000 2007-01-17
  • 打赏
  • 举报
回复
不要用数组,你传个XML然后解析一下
hongqi162 2007-01-17
  • 打赏
  • 举报
回复
用ftArray试试
国风 2007-01-17
  • 打赏
  • 举报
回复
没人这样调用过?

2,497

社区成员

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

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