工作存储过程编写问题

工作可能涉及到编写问题汇总(存储过程-COBOL)

1.程序注意事项
-- 注:修改前可以先美化 SQL 
1.支持判断为''' 'null 的场景
if(trim(i) is null)

2.主函数命名修改为:PROC_MAIN

3.存储过程命名需要确认(_D or _B...4.存储过程中有查询,确定查询条件是否是根据主键查询,
  主键查询时,需要添加:FETCH FIRST 1 ROW ONLY;
  
5. 游标中 存在 FOR UPDATE 结尾, COMMIT 需要放在循环体外,否则程序将会中断报错;
   PBCO.PCKG_PBCO_B_PUBMODUL.COMMIT_PROCESS;

6. 定义数组类型:
   TYPE AA IS TABLE OF VARCHAR2(50) INDEX BY PLS_INTEGER;
   BB AA;
   
   BB(1) := '下标1数据';
   BB(2) := '下标2数据';
   
   循环遍历数组简单用法:
   FOR I IN 1 .. BB.COUNT LOOP
   -- 循环体
   IF 条件 THEN
   -- 
   ELSE
   -- 
   END IF;
   END LOOP;
   
2. SQLCODE 修改

SQLCODE 不能在存储过程中使用
 (1)SQLCODE = NOT-FOUND 表示数据找不到,在存储过程中该场景需要写在 EXCEPTION 中
  如:
     WHEN NO_DATA_FOUND THEN 
     END_FLAG := 'T';
     
   游标中数据没有时写法:
   IF CUR_RTHFNJNL%NOTFOUND THEN
   END_OF_RTHFNJNL := 'T';2)SQLCODE NOT = 0 表示 查询失败(SQL-ERROR 程序中断),此时写在主程序下

(3)SQLCODE = 0 表示查询成功,该场景写在 
WHEN OTHERS THEN
PBCO.PCKG_PBCO__ERROR.RAISE_INFO('PROC_100_FETCH_RTHFNJNL_TABLE');4)存储过程中涉及到的 DML 语句 FETCH FIRST 1 ROW ONLY:
换行展示

(5)打印日志语句 DISPLAY 对应:
PBCO.PCKG_PBCO_B_PUBMODUL.WRITE_LOG('G_RTBRSSDD.AMT' ||· G_RTBRSSDD.AMT);

3. 字符串截位

字符串截位:
SUBSTR(BK1,29,1) <> '1' 对应存储过程中可以改为:
SUBSTR(RPAD(NVL(BK1,''),30,''),29,1) <> '1';
1.NVL(BK1,'') 判断 BK1 是否为空 ,如果为空返回'';
2.NVL(BK1,'') 如果 BK1 不为空,进行后续处理;
3.RPAD(NVL(BK1,''),30,'') 从右边对BK1进行填充,填充长度为30,填充字符串为 ''
4.SUBSTR(RPAD(NVL(BK1,''),30,''),29,1):填充之后,对填充后的BK1 进行截位从

注:
LPAD 这一函数,LPAD 函数是从左边对字符串使用指定的字符进行填充,
L是left(左边)的简写,PAD是padded(填充)的简写,所以LPAD就是从左边填充的意思。语法格式:
LPAD(string, padded_length, [pad_string])
eg:
--返回值长度大于源字符串长度,将进行填充
select LPAD('123', 4, '0') from dual;
结果为:0123
--返回值长度小于源字符串长度,将进行截断
select LPAD('123', 2) from dual;
结果为:12
--返回值长度大于源字符串长度,没填写对应的填充字符串,将进行填充空格
select LPAD('123', 5) from dual;
结果为:'  123'

RPAD 函数从右边对字符串使用指定的字符进行填充,语法格式:
RPAD(string,padded_length,[pad_string])
eg:
--返回值长度大于源字符串长度,将进行填充
select RPAD('123', 5, '0') from dual;
结果为:12300
--返回值长度小于源字符串长度,将进行截断
select RPAD('123', 2, '0') from dual;
结果为:12
--返回值长度大于源字符串长度,没填写对应的填充字符串,将进行填充空格
select RPAD('123', 5) from dual;
结果为:'123 '

COBOL程序代码:
MOVE A(1:4)  TO AA(1:4);
MOVE '-'     TO AA(5:1);
MOVE B(5:2)  TO AA(6:2);
MOVE '-'     TO AA(8:1);
MOVE C(7:2)  TO AA(9:2);

对应存储过程写法:
G_RTHPAMAC.AA = SUBSTR(G_FILE_BUFF_RFPAMAC('A'),1,4) || '-' ||
			   SUBSTR(G_FILE_BUFF_RFPAMAC('B'),5,2) || '-' ||
                SUBSTR(G_FILE_BUFF_RFPAMAC('C'),7,2);
                
4. substr 函数格式

1、substr函数格式   (俗称:字符截取函数)
  格式1: substr(string, int a, int b);
  格式2:substr(string, int a) ;

解析:
    格式11、string 需要截取的字符串
        2、a 截取字符串的开始位置(注:当a等于01时,都是从第一位开始截取)
        3、b 要截取的字符串的长度

    格式21、string 需要截取的字符串
        2、a 可以理解为从第a个字符开始截取后面所有的字符串。      
        
 1select substr('HelloWorld',0,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
 2select substr('HelloWorld',1,3) value from dual; //返回结果:Hel,截取从“H”开始3个字符
 3select substr('HelloWorld',2,3) value from dual; //返回结果:ell,截取从“e”开始3个字符
 4select substr('HelloWorld',0,100) value from dual; //返回结果:HelloWorld,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。
 5select substr('HelloWorld',5,3) value from dual; //返回结果:oWo
 6select substr('Hello World',5,3) value from dual; //返回结果:o W (中间的空格也算一个字符串,结果是:o空格W)
 7select substr('HelloWorld',-1,3) value from dual; //返回结果:d (从后面倒数第一位开始往后取1个字符,而不是3个。原因:下面红色 第三个注解)
 8select substr('HelloWorld',-2,3) value from dual; //返回结果:ld (从后面倒数第二位开始往后取2个字符,而不是3个。原因:下面红色 第三个注解)
 9select substr('HelloWorld',-3,3) value from dual; //返回结果:rld (从后面倒数第三位开始往后取3个字符)
10select substr('HelloWorld',-4,3) value from dual; //返回结果:orl (从后面倒数第四位开始往后取3个字符)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值