活动介绍
file-type

Oracle数据库循环语句LOOP…EXIT…END详解

PPT文件

下载需积分: 32 | 3.9MB | 更新于2024-08-15 | 18 浏览量 | 0 下载量 举报 收藏
download 立即下载
"Oracle数据库的学习文档,主要涵盖了循环语句LOOP…EXIT…END的使用以及Oracle数据库的历史和发展,包括Oracle11g的版本特性和硬件安装需求。" Oracle数据库是全球广泛使用的商业关系型数据库管理系统,由Oracle公司开发。自1979年发布第二版以来,Oracle数据库经历了多次重大更新,不断适应技术的发展。例如,ORACLE第六版引入了行级锁,第七版取得了巨大成功并支持面向对象开发,ORACLE8i则强调对互联网的支持,而ORACLE9i引入了Real Application Cluster (RAC) 提供高可用性。到了ORACLE10g,其“网格”概念展示了对分布式计算的集成,最后,ORACLE11g在2007年发布,带来了更多增强功能和优化。 在编程语法方面,文档提到了一个重要的控制结构——`LOOP…EXIT…END`循环语句。这种循环结构允许程序反复执行一个代码块,直到满足特定条件时通过`EXIT`语句退出循环。基本语法结构如下: ```sql LOOP <程序块 1> IF <条件表达式> THEN EXIT END IF <程序块 2> END LOOP; ``` 在这个结构中,`<程序块 1>`和`<程序块 2>`会依次执行,直到`<条件表达式>`为真,此时执行`EXIT`语句,跳出循环。这种循环控制方式在处理不确定迭代次数或者需要在满足特定条件时提前结束循环的场景中非常有用。 对于Oracle11g的安装,文档也给出了硬件需求的详细信息。最小物理内存要求是1GB,虚拟内存应至少是物理内存的两倍。安装所需磁盘空间约为5.2GB,包括Oracle根目录、数据文件、临时空间等各个部分。处理器主频至少需要550MHz,对于Windows Vista操作系统,要求更高。此外,还要求有256色的显示适配器和足够的磁盘空间来存放各个组件。 这份学习资料提供了Oracle数据库的基本知识,包括循环控制语句的使用和Oracle11g数据库的安装前的硬件规划,对初学者理解Oracle数据库及其编程有一定帮助。

相关推荐

filetype

以下代码怎么定义的查询,可以怎么优化查询速度: *&---------------------------------------------------------------------* *& 包含 ZMM_REP_001_SCREEN_1001 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Module STATUS_1001 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE status_1001 OUTPUT. SET PF-STATUS '1001'. * SET TITLEBAR 'xxx'. IF tree IS INITIAL. PERFORM create_tree. ENDIF. IF grid IS INITIAL. CREATE OBJECT container2 EXPORTING container_name = 'GIRD'. CREATE OBJECT grid EXPORTING i_parent = container2. PERFORM write_data. CALL METHOD grid->set_table_for_first_display EXPORTING is_layout = layout CHANGING it_fieldcatalog = fieldcatalog it_outtab = itab_out. ELSE. CALL METHOD grid->refresh_table_display. IF sy-subrc <> 0. ENDIF. ENDIF. ENDMODULE. *&---------------------------------------------------------------------* *& Module USER_COMMAND_1001 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE user_command_1001 INPUT. CASE sy-ucomm. WHEN 'SELECT'. PERFORM get_data USING node-node_key node-relatkey. WHEN 'BACK'. SET SCREEN 0. WHEN 'EXIT' OR 'CANCEL'. LEAVE PROGRAM. WHEN OTHERS. ENDCASE. ENDMODULE. *&---------------------------------------------------------------------* *& Form CREATE_TREE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM create_tree . CLEAR:event. REFRESH:events. event-eventid = 21 . event-appl_event = 'X'. APPEND event TO events. CLEAR:node. REFRESH:node_table. node-node_key = 'X'. node-isfolder = 'X'. node-text = TEXT-001. APPEND node TO node_table . LOOP AT ztree. CLEAR:node. node-node_key = 'X' && ztree-num1. node-relatkey = 'X'. node-isfolder = 'X'. node-text = ztree-text1. APPEND node TO node_table . CLEAR:node. node-node_key = 'X' && ztree-num1 && ztree-num2. node-relatkey = 'X' && ztree-num1. node-isfolder = 'X'. node-text = ztree-text2. APPEND node TO node_table . CLEAR:node. node-node_key = 'X' && ztree-num1 && ztree-num2 && ztree-num3. node-relatkey = 'X' && ztree-num1 && ztree-num2. node-isfolder = 'X'. node-text = ztree-text3. node-n_image = '@5B@'. APPEND node TO node_table . ENDLOOP. SORT node_table BY node_key relatkey. DELETE ADJACENT DUPLICATES FROM node_table COMPARING ALL FIELDS. CREATE OBJECT container EXPORTING container_name = 'TREE'. CREATE OBJECT tree EXPORTING parent = container node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single. CALL METHOD tree->add_nodes EXPORTING table_structure_name = 'MTREESNODE' node_table = node_table EXCEPTIONS error_in_node_table = 1 failed = 2 dp_error = 3 table_structure_name_not_found = 4 OTHERS = 5. CALL METHOD tree->set_registered_events EXPORTING events = events EXCEPTIONS cntl_error = 1 cntl_system_error = 2 illegal_event_combination = 3 OTHERS = 4. CREATE OBJECT application. SET HANDLER application->single_click FOR tree. CLEAR:node."不清空会导致首次查找有问题 ENDFORM. *&---------------------------------------------------------------------* *& Form WRITE_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM write_data . CLEAR:fieldcatalog. REFRESH:fieldcatalog. layout-no_toolbar = 'X'. * layout-cwidth_opt = 'X'. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MATNR'. wa_fieldcatalog-scrtext_l = TEXT-002. wa_fieldcatalog-outputlen = 40. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MAKTX'. wa_fieldcatalog-scrtext_l = TEXT-003. wa_fieldcatalog-outputlen = 20. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MAKTX_L'. wa_fieldcatalog-scrtext_l = TEXT-004. wa_fieldcatalog-outputlen = 40. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'WERKS'. wa_fieldcatalog-scrtext_l = TEXT-005. wa_fieldcatalog-outputlen = 4. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'LGORT'. wa_fieldcatalog-scrtext_l = TEXT-006. wa_fieldcatalog-outputlen = 5. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'BISMT'. wa_fieldcatalog-scrtext_l = TEXT-007. wa_fieldcatalog-outputlen = 10. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'LABST'. wa_fieldcatalog-scrtext_l = TEXT-008. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'BDMNG'. wa_fieldcatalog-scrtext_l = TEXT-009. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'LABST2'. wa_fieldcatalog-scrtext_l = TEXT-010. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MENGE'. wa_fieldcatalog-scrtext_l = TEXT-011. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'EISBE'. wa_fieldcatalog-scrtext_l = TEXT-012. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MEINS'. wa_fieldcatalog-scrtext_l = TEXT-013. wa_fieldcatalog-outputlen = 4. APPEND wa_fieldcatalog TO fieldcatalog. *-----ECCUpgradeS4--------SMY--------20250210-------START " 根据工厂判断是否添加 budat_mkpf 字段 IF p_werks = '7010' OR p_werks = '7011'. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'BUDAT_MKPF'. wa_fieldcatalog-scrtext_l = TEXT-014. wa_fieldcatalog-outputlen = 10. APPEND wa_fieldcatalog TO fieldcatalog. ENDIF. *-----ECCUpgradeS4--------SMY--------20250210-------END ENDFORM. *&---------------------------------------------------------------------* *& Form GET_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_NODE_NODE_KEY text * -->P_NODE_RELATKEY text *----------------------------------------------------------------------* FORM get_data USING p_node_key p_relatkey. REFRESH: itab, itab_out. *zhouyan 2025/8/6 " 优化主查询 - 只选择必要字段 SELECT mard~matnr, mard~werks, mard~lgort, mard~labst, mara~matkl, mara~meins, marc~eisbe INTO CORRESPONDING FIELDS OF TABLE @itab FROM mard INNER JOIN mara ON mara~matnr = mard~matnr INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks WHERE mard~werks = @p_werks AND marc~lvorm = '' AND mara~matkl <> '' AND mara~mtart = 'ERSA' AND mara~lvorm = '' AND mara~mstae = '' AND mard~lvorm = ''. *zhouyan 2025/8/6 LOOP AT itab. IF p_relatkey = ''. ELSEIF p_relatkey = 'X'. IF itab-matkl(1) <> p_node_key+1(1). DELETE itab. ENDIF. ELSE. IF strlen( p_node_key ) = 3. IF itab-matkl(2) <> p_node_key+1(2). DELETE itab. ENDIF. ELSEIF strlen( p_node_key ) = 4. IF itab-matkl(3) <> p_node_key+1(3). DELETE itab. ENDIF. ELSE. IF itab-matkl <> p_node_key+1. DELETE itab. ENDIF. ENDIF. ENDIF. ENDLOOP. " 首先检查itab是否为空 CHECK itab[] IS NOT INITIAL. " 收集所有需要查询的matnr(用于MAKT和MSEG查询) DATA: lt_matnr_range TYPE RANGE OF matnr. lt_matnr_range = VALUE #( FOR wa IN itab ( sign = 'I' option = 'EQ' low = wa-matnr ) ). " 收集所有需要查询的matnr+werks+lgort组合(用于ZMM_BISMT查询) DATA: lt_bismt_keys TYPE STANDARD TABLE OF ty_bismt_key. LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_itab>). APPEND VALUE #( matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort ) TO lt_bismt_keys. ENDLOOP. SORT lt_bismt_keys BY matnr werks lgort. DELETE ADJACENT DUPLICATES FROM lt_bismt_keys. " 将RANGE表转换为标准表 DATA: lt_matnr_list TYPE STANDARD TABLE OF matnr. lt_matnr_list = VALUE #( FOR ls_range IN lt_matnr_range ( ls_range-low ) ). " 使用FOR ALL ENTRIES查询 SELECT matnr, maktx FROM makt FOR ALL ENTRIES IN @lt_matnr_list WHERE matnr = @lt_matnr_list-table_line AND spras = @sy-langu INTO TABLE @DATA(lt_makt). " 批量查询ZMM_BISMT数据 IF lt_bismt_keys IS NOT INITIAL. SELECT matnr, werks, lgort, bismt FROM zmm_bismt FOR ALL ENTRIES IN @lt_bismt_keys WHERE matnr = @lt_bismt_keys-matnr AND werks = @lt_bismt_keys-werks AND lgort = @lt_bismt_keys-lgort INTO TABLE @DATA(lt_bismt). ENDIF. " 批量查询MSEG数据(最大过账日期) IF ( p_werks = '7011' OR p_werks = '7010' ) AND lt_matnr_range IS NOT INITIAL. SELECT matnr, MAX( budat_mkpf ) AS max_budat FROM mseg WHERE matnr IN @lt_matnr_range AND ( ( werks = '7011' AND bwart IN ('201','311') ) OR ( werks = '7010' AND bwart = '201' ) ) GROUP BY matnr INTO TABLE @DATA(lt_max_budat). ENDIF. " 更新itab数据 LOOP AT itab ASSIGNING <fs_itab>. " 更新MAKTX(物料描述) READ TABLE lt_makt ASSIGNING FIELD-SYMBOL(<fs_makt>) WITH KEY matnr = <fs_itab>-matnr. IF sy-subrc = 0. <fs_itab>-maktx = <fs_makt>-maktx. ENDIF. " 更新BISMT READ TABLE lt_bismt ASSIGNING FIELD-SYMBOL(<fs_bismt>) WITH KEY matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort. IF sy-subrc = 0. <fs_itab>-bismt = <fs_bismt>-bismt. ENDIF. " 更新BUDAT_MKPF(最大过账日期) IF p_werks = '7011' OR p_werks = '7010'. READ TABLE lt_max_budat ASSIGNING FIELD-SYMBOL(<fs_budat>) WITH KEY matnr = <fs_itab>-matnr. IF sy-subrc = 0. <fs_itab>-budat_mkpf = <fs_budat>-max_budat. ENDIF. ENDIF. ENDLOOP. LOOP AT itab. IF matnr <> ''. IF itab-matnr <> matnr. DELETE itab. CONTINUE. ENDIF. ENDIF. IF lgort <> ''. IF itab-lgort <> lgort. DELETE itab. CONTINUE. ENDIF. ENDIF. IF bismt <> ''. IF itab-bismt CS bismt. ELSE. DELETE itab. CONTINUE. ENDIF. ENDIF. IF itab-maktx CS maktx OR itab-maktx_l CS maktx. ELSE. DELETE itab. CONTINUE. ENDIF. IF eisbe_r1 = 'X'. IF itab-labst >= itab-eisbe. DELETE itab. CONTINUE. ENDIF. ENDIF. ENDLOOP. * 收集所有需要查询的matnr+werks+lgort组合 DATA: lt_resb_keys TYPE STANDARD TABLE OF ty_resb_key. LOOP AT itab ASSIGNING <fs_itab>. APPEND VALUE #( matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort ) TO lt_resb_keys. ENDLOOP. * 去重 SORT lt_resb_keys BY matnr werks lgort. DELETE ADJACENT DUPLICATES FROM lt_resb_keys. * 批量查询RESB数据(使用自定义结构) DATA: lt_resb_data TYPE STANDARD TABLE OF ty_resb_result. IF lt_resb_keys IS NOT INITIAL. SELECT matnr, werks, lgort, bdmng, enmng FROM resb FOR ALL ENTRIES IN @lt_resb_keys WHERE matnr = @lt_resb_keys-matnr AND werks = @lt_resb_keys-werks AND lgort = @lt_resb_keys-lgort AND xloek = '' AND kzear = '' AND shkzg = 'H' INTO CORRESPONDING FIELDS OF TABLE @lt_resb_data. ENDIF. * 更新itab数据 LOOP AT itab ASSIGNING <fs_itab>. CLEAR <fs_itab>-bdmng. * 查找匹配的RESB记录并累加 LOOP AT lt_resb_data ASSIGNING FIELD-SYMBOL(<fs_resb>) WHERE matnr = <fs_itab>-matnr AND werks = <fs_itab>-werks AND lgort = <fs_itab>-lgort. <fs_itab>-bdmng = <fs_itab>-bdmng + <fs_resb>-bdmng - <fs_resb>-enmng. ENDLOOP. ENDLOOP. * 收集查询条件(去重) DATA lt_po_keys TYPE ty_po_key_tab. lt_po_keys = VALUE #( FOR <wa> IN itab ( matnr = <wa>-matnr werks = <wa>-werks lgort = <wa>-lgort ) ). SORT lt_po_keys BY matnr werks lgort. DELETE ADJACENT DUPLICATES FROM lt_po_keys. * 执行批量查询 DATA lt_po_data TYPE ty_po_result_tab. IF lt_po_keys IS NOT INITIAL. " 查询EKPO数据 DATA lt_ekpo_data TYPE ty_ekpo_temp_tab. SELECT matnr,werks,lgort,menge,ebeln FROM ekpo FOR ALL ENTRIES IN @lt_po_keys WHERE matnr = @lt_po_keys-matnr AND werks = @lt_po_keys-werks AND lgort = @lt_po_keys-lgort AND elikz = '' AND loekz = '' INTO TABLE @lt_ekpo_data. " 查询已审批的采购订单 IF lt_ekpo_data IS NOT INITIAL. DATA lt_approved_po TYPE ty_ebeln_tab. SELECT ebeln FROM ekko FOR ALL ENTRIES IN @lt_ekpo_data WHERE ebeln = @lt_ekpo_data-ebeln AND frgke = '5' INTO TABLE @lt_approved_po. " 在应用层汇总数据 SORT lt_approved_po BY ebeln. LOOP AT lt_ekpo_data ASSIGNING FIELD-SYMBOL(<fs_ekpo>). READ TABLE lt_approved_po TRANSPORTING NO FIELDS WITH KEY ebeln = <fs_ekpo>-ebeln BINARY SEARCH. IF sy-subrc = 0. COLLECT VALUE ty_po_result( matnr = <fs_ekpo>-matnr werks = <fs_ekpo>-werks lgort = <fs_ekpo>-lgort menge = <fs_ekpo>-menge ) INTO lt_po_data. ENDIF. ENDLOOP. ENDIF. ENDIF. * 更新主表数据 LOOP AT itab ASSIGNING <fs_itab>. READ TABLE lt_po_data ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort. IF sy-subrc = 0. <fs_itab>-menge = <fs_po>-menge. ELSE. CLEAR <fs_itab>-menge. ENDIF. " 计算可用库存2 <fs_itab>-labst2 = <fs_itab>-labst - <fs_itab>-bdmng. ENDLOOP. *zhouyan 2025/8/7 itab_out[] = itab[]. *zhouyan 2025/8/7 ENDFORM.

filetype

#请将以下代码死循环插入执行满10次后,循环打印printf里面的内容 #!/bin/bash #---Shell QPS Loop Execution,Oracle user to execute #--- eg.sh oracle_qps.sh #---'execute count': 统计 SQL 执行总次数,用于计算 QPS。 #---'user commits': 统计用户提交事务的总次数,用于计算 TPS。 # source profile if [[ -z /home/oracle/.bash_profile ]] then . /home/oracle/.bash_profile fi # functions: execute count get_execute_count() { sqlplus -S "/ as sysdba" <<EOF | grep -v '^$' SET HEADING OFF FEEDBACK OFF PAGESIZE 0 VERIFY OFF TRIMSPOOL ON SELECT VALUE FROM V\$SYSSTAT WHERE NAME = 'execute count'; EXIT; EOF } # functions: get_committed rollbacks get_committed_rollbacks() { sqlplus -S "/ as sysdba" <<EOF | grep -v '^$' SET HEADING OFF FEEDBACK OFF PAGESIZE 0 VERIFY OFF TRIMSPOOL ON SELECT VALUE FROM V\$SYSSTAT WHERE NAME = 'user commits'; EXIT; EOF } count=0 # Loop Bodya while true; do printf "+----------------------------------------------+\n" printf "%-20s %-10s %-5s\n" "| Time | " " OPS |" " TPS |" printf "+----------------------------------------------+\n" for i in count=$((count + 1)) do # 初始化起始时间和执行计数值 START_TIME=$(date +%s) START_EXECUTE_COUNT=$(get_execute_count) START_COMMITTED_ROLLBACKS=$(get_committed_rollbacks) sleep 1 # 获取结束时间和新的执行计数值 END_TIME=$(date +%s) END_EXECUTE_COUNT=$(get_execute_count) END_COMMITTED_ROLLBACKS=$(get_committed_rollbacks) # 计算 QPS 和 TPS EXECUTE_DIFF=$((END_EXECUTE_COUNT - START_EXECUTE_COUNT)) COMMIT_DIFF=$((END_COMMITTED_ROLLBACKS - START_COMMITTED_ROLLBACKS)) TIME_DIFF=$((END_TIME - START_TIME)) if [[ $TIME_DIFF -eq 0 ]]; then echo "Error: Time difference is zero, cannot calculate metrics." >&2 continue fi QPS=$(echo "scale=2; $EXECUTE_DIFF / $TIME_DIFF" | bc) TPS=$(echo "scale=2; $COMMIT_DIFF / $TIME_DIFF" | bc) # 输出结果 TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") echo "[${TIMESTAMP}] ${QPS} ${TPS} " count=0 done done 优化以上代码

欧学东
  • 粉丝: 2552
上传资源 快速赚钱