怎样用delphi中的storedproc返回oracle8中的pl/sql表(200分)

  • 主题发起人 主题发起人 ncgxq
  • 开始时间 开始时间
N

ncgxq

Unregistered / Unconfirmed
GUEST, unregistred user!
我在oracle 8.0.5中创建一个包体:
CREATE OR REPLACE PACKAGE Test IS
TYPE ty_yhqf IS RECORD(
lqqf sfgl.yhdfxx.ys_df%TYPE, -- 老欠欠费
knqf sfgl.yhdfxx.ys_df%TYPE, -- 跨年欠费
bnqf sfgl.yhdfxx.ys_df%TYPE, -- 本年欠费
lqwyj sfgl.yhdfxx.ys_df%TYPE, -- 老欠违约金
ytwyj sfgl.yhdfxx.ys_df%TYPE, -- 预提违约金
yjdf sfgl.yhdfxx.ys_df%TYPE -- 预缴电费
);

TYPE ty_dfxx IS RECORD(
xt_nd sfgl.yhdfxx.xt_nd%TYPE,
xt_yf sfgl.yhdfxx.xt_yf%TYPE,
ys_df sfgl.yhdfxx.ys_df%TYPE,
ss_df sfgl.yhdfxx.ss_df%TYPE,
jsdf sfgl.yhdfxx.ys_df%TYPE,
wyj_yqrq DATE,
wyj_dj sfgl.wyjdj.wyj_dj1%TYPE,
jsts NUMBER,
dywyj sfgl.yhdfxx.ys_df%TYPE,
lq_bz sfgl.yhdfxx.lq_bz%TYPE,
dy_bz sfgl.yhdfxx.dy_bz%TYPE
);

TYPE pt_yhqf IS TABLE OF ty_yhqf INDEX BY BINARY_INTEGER;
TYPE pt_dfxx IS TABLE OF ty_dfxx INDEX BY BINARY_INTEGER;

pv_yhqf pt_yhqf;

END test;

CREATE OR REPLACE FUNCTION RetrictQf(fa_jkh sfgl.yhdfxx.jkdw_bh%TYPE,
fa_date DATE DEFAULT sysdate)
RETURN pt_yhqf IS
v_result sfgl.test.pt_yhqf;
v_yhdf sfgl.test.pt_dfxx;
v_index BINARY_INTEGER := 1;
v_tbdf sfgl.yhdfxx.ys_df%TYPE := 0;
v_jsdf sfgl.yhdfxx.ys_df%TYPE := 0;

CURSOR cur_yhdf IS
SELECT xt_nd,xt_yf,wyj_yqrq,zh_jkrq,ys_df,ss_df,lq_bz,dy_bz,wyj_dj1,wyj_dj2,wyj_dj3,wyj_dj4
FROM sfgl.yhdfxx a,sfgl.wyjdj b
WHERE a.wyj_lb = b.wyj_lb AND
a.jkdw_bh = fa_jkh
ORDER BY lq_bz DESC,xt_nd ASC,xt_yf ASC;

CURSOR cur_yjdf IS
SELECT yj_je
FROM sfgl.yjdf
WHERE jkdw_bh = fa_jkh;

CURSOR cur_lqwyj IS
SELECT NVL(sum(ys_wyjje - cx_wyjje),0) lqwyj
FROM sfgl.yswyj
WHERE jkdw_bh = fa_jkh;

BEGIN
FOR tmp_yjdf IN cur_yjdf LOOP
v_tbdf := tmp_yjdf.yj_je;
END LOOP;

v_result(1).lqqf := 0;
v_result(1).knqf := 0;
v_result(1).bnqf := 0;
v_result(1).lqwyj := 0;
v_result(1).ytwyj := 0;
v_result(1).yjdf := v_tbdf;

FOR tmp_lqwyj IN cur_lqwyj LOOP
v_result(1).lqwyj := tmp_lqwyj.lqwyj;
END LOOP;

FOR tmp_yhdf IN cur_yhdf LOOP
v_yhdf(v_index).xt_nd := tmp_yhdf.xt_nd;
v_yhdf(v_index).xt_yf := tmp_yhdf.xt_yf;
v_yhdf(v_index).ys_df := tmp_yhdf.ys_df;
v_yhdf(v_index).ss_df := tmp_yhdf.ss_df;
v_yhdf(v_index).lq_bz := tmp_yhdf.lq_bz;
v_yhdf(v_index).dy_bz := tmp_yhdf.dy_bz;

IF substr(tmp_yhdf.wyj_yqrq,1,2) = 'BY' THEN
v_yhdf(v_index).wyj_yqrq := trunc(to_date(tmp_yhdf.xt_nd||tmp_yhdf.xt_yf||substr(tmp_yhdf.wyj_yqrq,3,2),
'yyyymmdd'));
ELSE
IF v_yhdf(v_index).xt_yf = '12' THEN
v_yhdf(v_index).wyj_yqrq := trunc(to_date(tmp_yhdf.xt_nd||'01'||substr(tmp_yhdf.wyj_yqrq,3,2),'yyyymmdd'));
ELSE
v_yhdf(v_index).wyj_yqrq := trunc(to_date(tmp_yhdf.xt_nd||to_char(v_yhdf(v_index).xt_yf + 1,'00')||
substr(tmp_yhdf.wyj_yqrq,3,2),'yyyymmdd'));
END IF;
END IF;

IF v_yhdf(v_index).wyj_yqrq < tmp_yhdf.zh_jkrq THEN
v_yhdf(v_index).wyj_yqrq := trunc(tmp_yhdf.zh_jkrq);
END IF;

IF v_yhdf(v_index).lq_bz = 'Y' THEN
v_yhdf(v_index).wyj_dj := tmp_yhdf.wyj_dj1;
v_result(1).lqqf := v_result(1).lqqf + v_yhdf(v_index).ys_df - v_yhdf(v_index).ss_df;
ELSIF v_yhdf(v_index).xt_nd < to_char(fa_date,'yyyy') THEN
v_yhdf(v_index).wyj_dj := tmp_yhdf.wyj_dj2;
v_result(1).knqf := v_result(1).knqf + v_yhdf(v_index).ys_df - v_yhdf(v_index).ss_df;
ELSE
v_yhdf(v_index).wyj_dj := tmp_yhdf.wyj_dj3;
v_result(1).bnqf := v_result(1).bnqf + v_yhdf(v_index).ys_df - v_yhdf(v_index).ss_df;
END IF;

v_index := v_index + 1;

END LOOP;

v_result(1).yjdf := v_tbdf;

FOR v_idx IN v_yhdf.first..v_yhdf.last LOOP
IF v_yhdf(v_idx).ys_df - v_yhdf(v_idx).ss_df < 0 THEN
v_tbdf := v_tbdf + v_yhdf(v_idx).ss_df - v_yhdf(v_idx).ys_df;
END IF;
END LOOP;

FOR v_idx IN v_yhdf.first..v_yhdf.last LOOP
IF v_yhdf(v_idx).ys_df - v_yhdf(v_idx).ss_df > 0 THEN
IF v_yhdf(v_idx).ys_df - v_yhdf(v_idx).ss_df > v_tbdf THEN
v_jsdf := v_yhdf(v_idx).ys_df - v_yhdf(v_idx).ss_df - v_tbdf;
v_tbdf := 0;
ELSE
v_tbdf := v_tbdf + v_yhdf(v_idx).ss_df - v_yhdf(v_idx).ys_df;
v_jsdf := 0;
END IF;

IF v_jsdf > 0 AND ( v_yhdf(v_idx).ys_df - v_yhdf(v_idx).ss_df > 1 OR
( v_yhdf(v_idx).ys_df - v_yhdf(v_idx).ss_df < 1 AND v_yhdf(v_idx).dy_bz = 'N' )) AND
trunc(fa_date) > trunc(v_yhdf(v_idx).wyj_yqrq) THEN
v_yhdf(v_idx).jsts := trunc(fa_date) - trunc(v_yhdf(v_idx).wyj_yqrq);
v_yhdf(v_idx).jsdf := v_jsdf;
v_yhdf(v_idx).dywyj := v_yhdf(v_idx).jsdf * v_yhdf(v_idx).wyj_dj * 100 * v_yhdf(v_idx).jsts;
v_result(1).ytwyj := v_result(1).ytwyj + round(v_jsdf * v_yhdf(v_idx).wyj_dj * 100 *
( trunc(fa_date) - trunc(v_yhdf(v_idx).wyj_yqrq)));
END IF;
END IF;
END LOOP;

IF v_result(1).ytwyj > 0 AND v_result(1).ytwyj < 100 THEN
v_result(1).ytwyj := 1;
ELSE
v_result(1).ytwyj := v_result(1).ytwyj / 100;
END IF;

END RetrictQf;

END test;

在delphi5中的storedproc中,params[0]的datatype为ftADT,paramtype为ftresult。
params[1]的datatype为ftstring,paramtype为ftinput,value为20061,其它的参数
也设置了,但在执行时,报can't find object。
 
用PL/SQL DEVELOPER调试一下
肯定是不高级错误
 
此函数我已在下列开发环境中调试通过:
Win98 + personal oracle 8.1.5 pl/sql developer 3.0.4.344
UnixWare7.1 + Oracle 8.0.5
在Oracle方面决无问题
 
那应该是DELPHI代码中传递的参数有问题喽
 
可能需要在delphi中定义相应的结构,然后付值给它,在从此结构中取出各字段
 
bde是个通用的数据库引擎,对这种太专业化的、与其他数据库差别比较大的特性
支持不好
 
多人接受答案了。
 
后退
顶部