存储过程问题集合
来源:互联网 发布:dwf转换cad软件 编辑:程序博客网 时间:2024/06/08 10:41
当使用字符串长度超过限制
可以使用CLOB类型来存储字符串。
使用方式:
dbms_lob.createtemporary(ANLN2STR,true);--创建临时区
dbms_lob.append(ANLN1STR,v_temp_str);--往ANLN1STR追加字符串
to_char(dbms_lob.SUBSTR(ANLN1STR,32767,1);--CLOB转字符串,这里有个坑,dbms_lob.SUBSTR和SUBSTR函数后两个参数是相反意义的,详细用法百度。dbms_lob.freetemporary(ANLN1STR);--释放临时区
CREATE OR REPLACE PROCEDURE CPM_SP_IPRO_TEST( V_SCENARIO IN varchar2, V_PERIODO IN varchar2, V_USERUPD IN varchar2 )ASV_PROVENIENZA varchar2(20);V_PROSPETTO varchar2(20);ICOUNT Number;UCOUNT Number;ANLN1STR CLOB;ANLN2STR CLOB;BUKRSSTR CLOB;v_temp_str VARCHAR2(32767);cursor cursor_1 isselect '2900' BUKRS,ANLN1,ANLN2,TXT50,PDEBIT,DEBIT,PCREDIT,CREDIT,END_BALANCE ......); --声明游标初始化为ods查询结果BEGIN V_PROVENIENZA := 'MAP_SP_IPRO'; V_PROSPETTO := 'ZG_GL0001_IPT01'; ICOUNT := 0; UCOUNT := 0; v_temp_str := ''; dbms_lob.createtemporary(ANLN1STR,true); dbms_lob.createtemporary(ANLN2STR,true); dbms_lob.createtemporary(BUKRSSTR,true); FOR cu IN cursor_1 LOOP --记录抽取数据有的资产号,次资产号,公司 IF UCOUNT = 0 THEN v_temp_str := trim(cu.ANLN1); dbms_lob.append(ANLN1STR,v_temp_str); v_temp_str := cu.ANLN2; dbms_lob.append(ANLN2STR,v_temp_str); v_temp_str := cu.BUKRS; dbms_lob.append(BUKRSSTR,v_temp_str); ELSE v_temp_str := ','||cu.ANLN1; dbms_lob.append(ANLN1STR,v_temp_str); v_temp_str := ','||cu.ANLN2; dbms_lob.append(ANLN2STR,v_temp_str); v_temp_str := ','||cu.BUKRS; dbms_lob.append(BUKRSSTR,v_temp_str); END IF; --更新FORM_DATI中存在于抽取数据的记录 UPDATE FORM_DATI_TMP SET IMPORTO_2 = cu.PDEBIT, IMPORTO_3 = cu.DEBIT, IMPORTO_67 = cu.PCREDIT, IMPORTO_4 = cu.CREDIT, IMPORTO_5 = cu.END_BALANCE WHERE COD_PROSPETTO = V_PROSPETTO AND COD_SCENARIO = V_SCENARIO AND COD_PERIODO = V_PERIODO AND COD_AZIENDA = cu.BUKRS AND PROVENIENZA = V_PROVENIENZA AND TESTO_6 = cu.ANLN1 AND TESTO_7 = cu.ANLN2 AND COD_CATEGORIA = '$AMOUNT'; UCOUNT := UCOUNT+1; --插入现存在而原先不存在的记录 IF sql%rowcount <= 0 OR sql%rowcount IS NULL THEN UCOUNT := UCOUNT-1; INSERT /* +APPEND*/ INTO FORM_DATI_TMP( OID_FORM_DATI , COD_PROSPETTO, COD_SCENARIO, COD_PERIODO, COD_AZIENDA, TESTO_6, TESTO_7, TESTO_1, COD_CATEGORIA, IMPORTO_2, IMPORTO_3, IMPORTO_67, IMPORTO_4, IMPORTO_5, DATEUPD, USERUPD, PROVENIENZA ) VALUES( NEWID(), V_PROSPETTO, V_SCENARIO, V_PERIODO, cu.BUKRS, cu.ANLN1, cu.ANLN2, cu.TXT50, '$AMOUNT', cu.PDEBIT, cu.DEBIT, cu.PCREDIT, cu.CREDIT, cu.END_BALANCE, SYSDATE, V_USERUPD, V_PROVENIENZA ); ICOUNT := ICOUNT +1; END IF; END LOOP; dbms_output.put_line('插入FORM_DATI_TMP条目数:'||to_char(ICOUNT)||'条'); dbms_output.put_line('更新FORM_DATI_TMP条目数:'||to_char(UCOUNT)||'条'); --删除不存在与抽取数据(资产号 +次资产号+公司)的数据 DELETE from FORM_DATI_TMPWHERE COD_SCENARIO = V_SCENARIO AND COD_PERIODO = V_PERIODO AND PROVENIENZA = V_PROVENIENZA AND COD_PROSPETTO = V_PROSPETTO AND TESTO_6 NOT IN ( to_char(dbms_lob.SUBSTR(ANLN1STR,32767,1))|| to_char(dbms_lob.SUBSTR(ANLN1STR,32767,32767))|| to_char(dbms_lob.SUBSTR(ANLN1STR,32767,32767+32767)) ) AND ...; dbms_output.put_line('从FORM_DATI_TMP删除条目数:'||to_char(sql%rowcount)||'条'); dbms_lob.freetemporary(ANLN1STR);--释放lob dbms_lob.freetemporary(ANLN2STR);--释放lob dbms_lob.freetemporary(BUKRSSTR);--释放lob COMMIT;EXCEPTION WHEN OTHERS THEN rollback; dbms_output.put_line('捕获到异常,完成回滚:'||'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);END;
阅读全文
0 0
- 存储过程问题集合
- oracle存储过程返回集合
- 存储过程经典问题
- 存储过程经典问题
- 存储过程问题
- 存储过程经典问题
- oracle存储过程问题
- 存储过程问题小结
- MySQL存储过程问题
- 存储过程定位问题
- 将java的集合转换为数据库集合类型 解决weblogic调用存储过程的时候,返回值乱码问题
- 存储过程:Transact-SQL语句的集合
- JAVA调用存储过程--传入集合参数
- oracle存储过程,集合对象处理
- php调用MySQL存储过程方法集合
- c# 通过存储过程返回表集合
- Oracle存储过程详解(三)-集合
- oracle存储过程,集合对象处理
- 如何使用GitLab和Rancher构建CI/CD流水线 – Part 2
- 用UIKit Dynamics模仿UIScrollView
- [编程题] 连续整数
- 【Sonar】——架构与集成
- 关于学习NDK基础知识这些就够了(三)
- 存储过程问题集合
- Ubuntu14.04安装PANDA过程中出现cc1: warnings being treated as errors
- 关于Linux系统启动的流程
- poj2985(名次树(treap))找第k大 The k-th Largest Group
- Spring事件(Application Event)
- android文件系统挂载分析(1)---正常开机挂载
- C语言可变参数列表
- 配置SpringMVC+Mybatis+SQLServer (1)
- 莫比乌斯反演入门