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。
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。