Oracle技术汇总手册

1、常用函数

Lpad()函数的用法:
lpad函数将左边的字符串填充一些特定的字符其语法格式如下:   
     lpad(string,n,
[pad_string])
     string:可是字符或者参数
     n:字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
     pad_string:是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。
    例如:
lpad(
'tech', 7); 将返回' tech'
lpad(
'tech', 2); 将返回'te'
lpad(
'tech', 8, '0'); 将返回'0000tech'
lpad(
'tech on the net', 15, 'z'); 将返回 'tech on the net'
lpad(
'tech on the net', 16, 'z'); 将返回 'ztech on the net'


------------------------------------


Rpad()函数的用法:
rpad函数将右边的字符串填充一些特定的字符其语法格式如下:   
     rpad(string,n,
[pad_string])
     string:可是字符或者参数
     n:字符的长度,是返回的字符串的数量,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
     pad_string:是个可选参数,这个字符串是要粘贴到string的右边,如果这个参数未写,lpad函数将会在string的右边粘贴空格。
    例如:
rpad(
'tech', 7); 将返回' tech'
rpad(
'tech', 2); 将返回'te'
rpad(
'tech', 8, '0'); 将返回'tech0000'
rpad(
'tech on the net', 15, 'z'); 将返回 'tech on the net'
rpad(
'tech on the net', 16, 'z'); 将返回 'tech on the netz'

 

2、定义并使用游标

定义:

CREATE OR REPLACE PACKAGE query_pkg is

  -- Author  : lijinchang

  -- Created : 2006-3-29 17:19:29
  -- Purpose : ????

  -- Public type declarations
  type Query_cur is ref cursor;
end query_pkg;

使用:

create or replace procedure Jiekou_hpcaozuo(
v_wenjianmc                 in     varchar2,--文件名
v_account                   in     varchar2,--操作人
v_I_XIAOZHANGBH             in     integer,--销账编号
v_date                      in     date,--操作时间
v_ip                        in     varchar2,--计算机ip
V_I_JIEZHANGPH              in     integer,--结账批号
V_I_SHOUFEIPH               in     integer,--收费批号
v_bankid                    in     varchar2,--总行编号
semu_cur     out query_pkg.Query_cur    
)
is
   V_ID          integer;
   c_list query_pkg.Query_cur;
   v_count  integer:=0;
   v_I_FEEID      YW_WENJIANSJ_YWMX.i_Feeid%type;--feeid;
   v_s_cid        YW_WENJIANSJ_YWMX.s_Cid%type;--销根号
   v_I_Y          YW_WENJIANSJ_YWMX.i_y%type;--账务年
   v_i_m          YW_WENJIANSJ_YWMX.i_m%type;--账务月
   v_i_cc         YW_WENJIANSJ_YWMX.i_cc%type;--抄次
   v_I_KAIZHANGSL YW_WENJIANSJ_YWMX.i_Kaizhangsl%type;--开账水量
   v_n_je         YW_WENJIANSJ_YWMX.n_Je%type;--金额
   v_N_LINGTOU    YW_WENJIANSJ_YWMX.N_LINGTOU%type;--零头;
   v_N_KAIZHANGJE YW_WENJIANSJ_YWMX.N_KAIZHANGJE%type;--开账金额;
   v_I_KAIHUYH    YW_WENJIANSJ_YWMX.I_KAIHUYH%type;--开户银行                          
   v_S_KAIHUHM    YW_WENJIANSJ_YWMX.S_KAIHUHM%type;--开户户名
   v_S_YINHANGZH  YW_WENJIANSJ_YWMX.S_YINHANGZH%type;--银行帐户
   v_I_HUAZHANGBH YW_WENJIANSJ.I_HUAZHANGBH%type;--划账编号
   v_I_YINHANGBH  YW_WENJIANSJ.i_Yinhangbh%type;--银(总)行编号
   v_i_RUZHANG    integer;--入账类型
   v_i_zhangwuny  integer;--账务年月
   v_s_st         kg_biaokaxx.s_st%type;--站点
  
   totoalbs        integer;--总笔数
   totoalje       SF_SHOUFEIHZ.n_Shishouje%type;--总金额
  
   totoalzcbs      integer;--正常笔数
   totoalzcje      SF_SHOUFEIHZ.n_Zhengchangje%type;--正常金额
  
   totoalcbbs      integer;--重笔笔数
   totoalcbje       SF_SHOUFEIHZ.n_Chongbije%type;--重笔金额
  
   totoalynbs      integer;--疑难笔数
   totoalynje      SF_SHOUFEIHZ.n_Yinanje%type;--疑难金额
  
v_sql varchar2(2000):='';
begin
v_sql:='
select t3.*,
t4.s_st from
(SELECT
T.I_FEEID,
T.S_CID,
T.I_Y,
T.I_M,
T.I_CC,
T.I_KAIZHANGSL,
T.N_JE,
T.N_LINGTOU,
T.N_KAIZHANGJE,
T.I_KAIHUYH,
T.S_KAIHUHM,
T.S_YINHANGZH,
T1.I_HUAZHANGBH,
T1.I_YINHANGBH,
jiekou_getruzhangzt(T.I_Y,T.I_M,T.I_FEEID,T.N_JE)  AS I_RUZHANG,
to_number(to_char(T.I_Y)||case length(to_char(T.I_M)) when 1
then ''0''||to_char(T.I_M) else to_char(T.I_M) end)  as I_ZHANGWUNY
FROM YW_WENJIANSJ_YWMX T,
YW_WENJIANSJ T1
WHERE T1.I_WENJIANBH=T.I_WENJIANBH
AND T1.S_WENJIANM='''||v_wenjianmc||''') t3
left join
kg_biaokaxx t4 on t3.s_cid=t4.s_cid'
;
open c_list for v_sql;
if c_list%notfound then
v_count:=0;
return;
else
v_count:=1;
loop
fetch c_list into v_I_FEEID,v_s_cid,
v_I_Y,v_i_m,v_i_cc,
v_I_KAIZHANGSL,v_n_je,
v_N_LINGTOU,v_N_KAIZHANGJE,
v_I_KAIHUYH,v_S_KAIHUHM,v_S_YINHANGZH,
v_I_HUAZHANGBH,v_I_YINHANGBH,v_i_RUZHANG,
v_i_zhangwuny
;
V_ID :=GSELNEXTSF_SHOUFEIMXID();
INSERT INTO SF_SHOUFEIMX (
 SF_SHOUFEIMX.ID,
 SF_SHOUFEIMX.S_PCID,
 SF_SHOUFEIMX.I_JIEZHANGPH,
 SF_SHOUFEIMX.I_SHOUFEIPH,
 SF_SHOUFEIMX.I_ZHANGWUNY,
 SF_SHOUFEIMX.S_ST,
 SF_SHOUFEIMX.I_FEEID,
 SF_SHOUFEIMX.S_CID,
 SF_SHOUFEIMX.I_CHAOBIAON,
 SF_SHOUFEIMX.I_CHAOBIAOY,
 SF_SHOUFEIMX.I_CC,
 SF_SHOUFEIMX.N_JE,
 SF_SHOUFEIMX.N_YINGSHOUZNJ,
 SF_SHOUFEIMX.N_SHISHOUZNJ,
 SF_SHOUFEIMX.I_JINCHU,
 SF_SHOUFEIMX.I_SHOUFEILX,
 SF_SHOUFEIMX.I_RUZHANG,
 SF_SHOUFEIMX.I_TUIKUANLX,
 SF_SHOUFEIMX.S_SHOUFEIYBH,
 SF_SHOUFEIMX.DL_SHOUFEIRQ,
 SF_SHOUFEIMX.D_SHOUFEISJ,
 SF_SHOUFEIMX.I_XIAOZHANGBH,
 SF_SHOUFEIMX.I_DAYINCS,
 SF_SHOUFEIMX.S_ZHANGDANTXM,
 SF_SHOUFEIMX.S_BEIZHU,
 SF_SHOUFEIMX.S_BEIZHU1,
 SF_SHOUFEIMX.S_CAOZUOR,
 SF_SHOUFEIMX.D_CAOZUOSJ,
 SF_SHOUFEIMX.I_JLZT
) VALUES (
  V_ID,
  V_ip,
  V_I_JIEZHANGPH,
  V_I_SHOUFEIPH,
  V_I_ZHANGWUNY,
  V_S_ST,
  V_I_FEEID,
  V_S_CID,
  V_I_Y,
  V_I_M,
  V_I_CC,
  V_N_JE,
  0,
  0,
  1,
  0,
  V_I_RUZHANG,
  0,
  v_account,
  to_number(to_char(v_date,'yyyyMMdd')),
  v_date,
  V_I_XIAOZHANGBH,
  0,
  0,
  '无',
  '无',
  v_account,
  v_date,
  0
);

totoalbs:=totoalbs+1;--总笔数
totoalje:=totoalje+v_n_je;--总金额
if v_i_RUZHANG=0 then

totoalzcbs:=totoalzcbs+1;--正常笔数
totoalzcje:=totoalzcje+v_n_je;--正常金额

--正常的做销账处理

update zw_yingyez
set zw_yingyez.I_XIAOZHANG = 3,--已销
zw_yingyez.I_JIEZHANGPH = v_I_JIEZHANGPH,--结账批号
zw_yingyez.I_SHOUFEITJ = 4,--收费途径
zw_yingyez.D_XIAOZHANGRQ = v_date,--销账日期
zw_yingyez.DL_XIAOZHANGRQ = to_number(to_char(v_date,'yyyyMMdd')),--销账日期
zw_yingyez.I_XIAOZHANGBH = v_I_XIAOZHANGBH --销账编号

where zw_yingyez.i_feeid=v_I_FEEID
;
end if;

if v_i_RUZHANG=1 then
totoalcbbs:=totoalcbbs+1;--重笔笔数
totoalcbje:=totoalcbje+v_n_je;--重笔金额

--重笔的插入到待处理表
CS_InsZW_DAICHULI
 (
  0,
  0,
  0,
  0,
  v_i_RUZHANG,
  0,
  v_account,
  v_date,
  '无',
  V_ip,
  V_I_JIEZHANGPH,
  V_I_SHOUFEIPH,
  V_I_ZHANGWUNY,
  V_S_ST,
  V_I_FEEID,
  V_S_CID,
  v_I_Y,
  v_I_m,
  V_I_CC,
  V_N_JE,
  0,
  0,
  1,
  0,
  V_I_RUZHANG,
  0,
  V_account,
  to_number(to_char(v_date,'yyyyMMdd')),
  v_date,
  V_I_XIAOZHANGBH,
  0,
  '无',
  '五',
  '无',
  v_account,
  v_date,
  0,
  v_date,
  v_account,
  V_N_JE,
  V_ID
);
end if;
if v_i_RUZHANG=2 then

totoalynbs:=totoalynbs+1;--疑难笔数
totoalynje:=totoalynje+v_n_je;--疑难金额

--疑难的插入到待处理表
CS_InsZW_DAICHULI
 (
  0,
  0,
  0,
  0,
  v_i_RUZHANG,
  0,
  v_account,
  v_date,
  '无',
  V_ip,
  V_I_JIEZHANGPH,
  V_I_SHOUFEIPH,
  V_I_ZHANGWUNY,
  V_S_ST,
  V_I_FEEID,
  V_S_CID,
  v_I_Y,
  v_I_m,
  V_I_CC,
  V_N_JE,
  0,
  0,
  1,
  0,
  V_I_RUZHANG,
  0,
  V_account,
  to_number(to_char(v_date,'yyyyMMdd')),
  v_date,
  V_I_XIAOZHANGBH,
  0,
  '无',
  '五',
  '无',
  v_account,
  v_date,
  0,
  v_date,
  v_account,
  V_N_JE,
  V_ID
);
end if;
end loop;
end if;
close c_list;

V_ID :=GSELNEXTSF_SHOUFEIXJID();
INSERT INTO SF_SHOUFEIXJ (
 SF_SHOUFEIXJ.ID,
 SF_SHOUFEIXJ.S_PCID,
 SF_SHOUFEIXJ.I_JIEZHANGPH,
 SF_SHOUFEIXJ.I_SHOUFEIPH,
 SF_SHOUFEIXJ.S_ST,
 SF_SHOUFEIXJ.N_XIAOJIJE,
 SF_SHOUFEIXJ.S_SHUAKALSH,
 SF_SHOUFEIXJ.S_HAOMA,
 SF_SHOUFEIXJ.I_ZHIFULX,
 SF_SHOUFEIXJ.S_SHOUFEIYBH,
 SF_SHOUFEIXJ.D_SHOUFEISJ,
 SF_SHOUFEIXJ.DL_SHOUFEIRQ,
 SF_SHOUFEIXJ.S_BEIZHU,
 SF_SHOUFEIXJ.S_BEIZHU1,
 SF_SHOUFEIXJ.S_CAOZUOR,
 SF_SHOUFEIXJ.D_CAOZUOSJ,
 SF_SHOUFEIXJ.I_JLZT
) VALUES (
  V_ID,
  V_ip,
  V_I_JIEZHANGPH,
  V_I_SHOUFEIPH,
  V_S_ST,
  totoalje,
  '',
  '',
  0,
  v_account,
    v_date,
  to_number(to_char(v_date,'yyyyMMdd')),
  '无',
  '无',
  v_account,
  v_date,
  0
);

V_ID :=GSELNEXTSF_SHOUFEIHZID();
 INSERT INTO SF_SHOUFEIHZ (

 SF_SHOUFEIHZ.ID,
 SF_SHOUFEIHZ.S_ST,
 SF_SHOUFEIHZ.S_PCID,
 SF_SHOUFEIHZ.S_SHOUFEIDBH,
 SF_SHOUFEIHZ.I_SHOUFEITJ,
 SF_SHOUFEIHZ.I_JIEZHANGPH,
 SF_SHOUFEIHZ.I_SHOUFEIJD,
 SF_SHOUFEIHZ.I_YINGSHOUBS,
 SF_SHOUFEIHZ.N_YINGSHOUJE,
 SF_SHOUFEIHZ.I_SHISHOUBS,
 SF_SHOUFEIHZ.N_SHISHOUJE,
 SF_SHOUFEIHZ.I_ZHENGCHANGBS,
 SF_SHOUFEIHZ.N_ZHENGCHANGJE,
 SF_SHOUFEIHZ.I_CHONGBIBS,
 SF_SHOUFEIHZ.N_CHONGBIJE,
 SF_SHOUFEIHZ.I_YINANBS,
 SF_SHOUFEIHZ.N_YINANJE,
 SF_SHOUFEIHZ.I_JIADANBS,
 SF_SHOUFEIHZ.N_JIADANJE,
 SF_SHOUFEIHZ.I_TEZHANGBS,
 SF_SHOUFEIHZ.N_TEZHANGJE,
 SF_SHOUFEIHZ.I_CHAEBS,
 SF_SHOUFEIHZ.N_CHAEJE,
 SF_SHOUFEIHZ.I_LINGTOUSBS,
 SF_SHOUFEIHZ.N_LINGTOUSJE,
 SF_SHOUFEIHZ.I_TUIKUANBS,
 SF_SHOUFEIHZ.N_TUIKUANJE,
 SF_SHOUFEIHZ.D_JIEZHANGRQ,
 SF_SHOUFEIHZ.S_SHOUFEIYBH,
 SF_SHOUFEIHZ.D_XIAOZHANGRQ,
 SF_SHOUFEIHZ.I_XIAOZHANGBH,
 SF_SHOUFEIHZ.S_XIAOZHANGYBH,
 SF_SHOUFEIHZ.S_JIEZHANGTXM,
 SF_SHOUFEIHZ.S_BEIZHU,
 SF_SHOUFEIHZ.S_BEIZHU1,
 SF_SHOUFEIHZ.S_CAOZUOR,
 SF_SHOUFEIHZ.D_CAOZUOSJ,
 SF_SHOUFEIHZ.I_JLZT
) VALUES (
  V_ID,
  V_S_ST,
  V_ip,
  v_bankid,
  4,
  V_I_JIEZHANGPH,
  3,
  totoalbs,
  totoalje,
  totoalbs,
  totoalje,
  totoalzcbs,
  totoalzcje,
  totoalcbbs,
  totoalcbje,
  totoalynbs,
  totoalynje,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  0,
  v_date,
  v_account,
  v_date,
  V_I_XIAOZHANGBH,
  v_account,
  '',
  '',
  '',
  v_account,
  v_date,
  0
);
end Jiekou_hpcaozuo;

3、自定义函数的定义

create or replace function jiekou_getruzhangzt
(
-------------------------------------
--作者:李金昌
--时间:2010-10-28
--功能:判断一笔yw_wenjiansj_ywmx记录对应的账务信息的入账状态
-------------------------------------
I_Y              IN        INTEGER,
I_M              IN        INTEGER,
I_FEEID          IN        INTEGER,
N_JE             IN        NUMBER
)
return integer
is
V_RUZHANG              INTEGER;
V_SQL                      varchar2(4000):= '';
tablename                  varchar2(150):='';
v_COUNT                    INTEGER  ;
v_recordcount              integer;
v_I_M                      varchar2(2):='';
begin
if length(I_M)=1 then
v_I_M:='0'||I_M;
else
v_I_M:=''||I_M;
end if;
tablename:=upper('xz_yingyez'||I_Y||v_I_M);--销账历史记录表名
select Count(1) into  v_count from all_all_tables a where a.owner = 'VEOLIAUSER_HIS' and a.table_name = tablename;
if v_COUNT <>0 then
  V_SQL:='
  select count(1) from
  (
  select 1 from '||tablename||'
  where i_feeid='||I_FEEID||' and N_JE=
  '||N_JE||'
  union
  select 1 from zw_yingyez t where
  t.i_feeid='||I_FEEID||' and t.N_JE=
  '||N_JE||' and I_xiaozhang>0
  )'
  ;
else
  V_SQL:='
  select count(1) from
  (
  select 1 from zw_yingyez t where
  t.i_feeid='||I_FEEID||' and t.N_JE=
  '||N_JE||' and I_xiaozhang>0
  )'
  ;
end if;
execute immediate v_sql into  v_recordcount;
if v_recordcount>0 then
   V_RUZHANG:=1;--重笔状态
else
    V_SQL:='
    select count(1) from
    (
    select 1 from zw_yingyez t where
    t.i_feeid='||I_FEEID||' and t.N_JE=
    '||N_JE||' and I_xiaozhang=0
    )'
    ;
    execute immediate v_sql into  v_recordcount;
    if v_recordcount>0 then
    V_RUZHANG:=0;--正常状态
    else
    V_RUZHANG:=2;--疑难帐状态
    end if;
end if;
return V_RUZHANG;
end jiekou_getruzhangzt;

原文地址:https://www.cnblogs.com/lijinchang/p/1872417.html