起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 269|回复: 9

【搞定】用TStoredProc调用oracle存储过程,报错**

[复制链接]
发表于 2007-5-16 16:30:31 | 显示全部楼层 |阅读模式
oracle的存储过程定义如下
PROCEDURE P_YDZZ_XGYDBZXX(
CZRK_CSXXID      IN  NUMBER,                                 
CZRK_SLH         IN  VARCHAR2,   
CZRK_YDBZYID     IN  NVARCHAR2,                              
CZRK_YDBZSJ      IN  CHAR,                                   
RETCODE          OUT CHAR,
RETMSG           OUT VARCHAR2);
被写在YDZZ的包里面,没有结果集的返回


我的调用代码如下
sp_ok: TStoredProc;   



procedure TYDZZXQ_ZCT.Save_ok();
begin
  sp_ok.Close;
  sp_ok.StoredProcName := 'YDZZ.P_YDZZ_XGYDBZXX';
  sp_ok.Params.Clear;
  sp_ok.Params.CreateParam(TFieldType.ftFloat,'CZRK_CSXXID',TParamType.ptInput);
  sp_ok.Params.CreateParam(TFieldType.ftString,'CZRK_SLH',TParamType.ptInput);
  sp_ok.Params.CreateParam(TFieldType.ftString,'CZRK_YDBZYID',TParamType.ptInput);
  sp_ok.Params.CreateParam(TFieldType.ftString,'CZRK_YDBZSJ',TParamType.ptInput);
  sp_ok.Params.CreateParam(TFieldType.ftString,'RETCODE',TParamType.ptOutput);
  sp_ok.Params.CreateParam(TFieldType.ftString,'RETMSG',TParamType.ptOutput);
  with sp_ok.Params do
  begin
    ParamByName('CZRK_CSXXID').AsFloat :=TYDZZXX(InfoBrokerYDZZXX.Info).DataSetYDZZXXZ.FieldByName('SBXXID').AsFloat;
    ParamByName('CZRK_SLH').AsString :=SysUtils.Trim(edtSlh.Text);
    ParamByName('CZRK_YDBZYID').AsString := '';//TSystemCore.Operator.DisplayName;
    ParamByName('CZRK_YDBZSJ').AsString := SysUtils.FormatDateTime('yyyymmdd',dtpYdbzqrsj.Date);
  end;
  sp_ok.Execute;
  if sp_ok.Params.ParamByName('RETCODE').AsInteger<1 then
    raise Exception.create(sp_ok.Params.ParamByName('RETMSG').AsString);
end;

问题1:报"无效的列索引类型"
问题2:我的存储过程里面的number类型,对应TFieldType的哪一个?

请大侠们指点
回复

使用道具 举报

发表于 2007-5-16 16:55:10 | 显示全部楼层
1、使用系统提供的存储过程控件时,不要用代码去创建或删除参数,否则会报无效的列索引错误(为控件指定存储过程名称后,控件会自动创建参数)。
  此问题在论坛中有帖子讨论过,楼主可以搜索一下作为参考

2、可以对应为float或double类型
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-16 17:00:23 | 显示全部楼层
但是当我在控件中指定存储过程只能是P_YDZZ_XGYDBZXX,系统可以自己找到对应的参数.但是运行的时候会报找不到该名字的存储过程,所以只能设置为YDZZ.P_YDZZ_XGYDBZXX.但这样,控件就不会自己添加参数了,怎么解决?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-16 17:04:24 | 显示全部楼层
就是控件没有办法添加存储过程的包名,而运行时却是需要指定包名,这样我就只能自己指定和添加参数了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-17 08:30:59 | 显示全部楼层
有没有高手指点一下啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-17 13:05:09 | 显示全部楼层
管理员呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-17 14:42:16 | 显示全部楼层
没有人知道这个问题啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-17 15:46:22 | 显示全部楼层
justep 的人呢?就没有解决办法???
我有100个存储规程,就放100个控件???
回复 支持 反对

使用道具 举报

发表于 2007-5-17 17:52:13 | 显示全部楼层
楼主,目前平台不支持写在包里的存储过程,所以会出现你所描述的问题。
目前没有什么太好的办法。
建议,在数据库中在创建一个存储过程来调用包里的过程。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-18 16:50:20 | 显示全部楼层
结贴吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-1-10 11:52 , Processed in 0.037416 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表