Oracle动态游标用法

最近在写一个存档的procedure时,因为条件不同,组成的SQL也不同。

  1 CREATE OR REPLACE
  2 PROCEDURE led_bl_issue_save_new ----大标签发料存档LED031C
  3 (
  4    i_worknosid      NUMBER,---工单ID
  5    i_led_partno     VARCHAR2,---LED料号
  6    i_led_partid     VARCHAR2,---LED料号ID
  7    i_bincode1       VARCHAR2, ---BIN1
  8    i_datecode1      VARCHAR2,---周期1
  9    i_bin1_qty       number,---BIN1数量
 10    i_bincode2       VARCHAR2,--BIN2
 11    i_datecode2      VARCHAR2,---周期2
 12    i_bin2_Qty       number,---BIN2数量
 13    i_iusqty         NUMBER,---发料数量
 14    i_iustype        NUMBER,---发料类型
 15    i_bl1_sid        NUMBER,---大标签1ID
 16    i_bl2_sid        NUMBER,---大标签2ID
 17    i_pmp_bin        VARCHAR2,---喷墨BIN
 18    i_usersid        NUMBER----USERID
 19 )
 20 IS
 21    xMse0306_f001    mse0306.f001%TYPE               := 0;
 22    xReelno          sajet.g_part_map.part_sn%TYPE   := ‘N/A‘;
 23    type ref_cursor  is  ref cursor;
 24    xCursor ref_cursor ;
 25    xSqlCommand      varchar(2000);
 26    xBin1Qty_Sys         number :=0;-----系统中的BIN1数量
 27    xBin1Qty_New     number := 0;-----待更新的BIN1数量
 28    xBin2Qty_Sys         number :=0;-----系统中的BIN2数量
 29    xBin2Qty_New     number := 0;-----待更新的BIN2数量
 30    xBinQty_Sys         number :=0;-----系统中的BIN数量
 31    xBinQty_New     number := 0;-----待更新的BIN数量
 32 BEGIN
 33
 34 ----获得MSE0306.F001
 35    IF i_iustype=0 THEN
 36       xSqlCommand:= ‘SELECT f001 FROM MSE0306 WHERE WK_ORD_ID=‘ || i_worknosid || ‘ AND  TYPE_ID=0 AND STATUS=0‘||
 37                     ‘ AND BIN2 IS  NULL AND DATECODE2 IS NULL AND BIN1=‘‘‘|| i_bincode1 ||‘‘‘‘;
 38       if i_datecode1 =‘‘ then
 39          xSqlCommand := xSqlCommand ||‘ AND DATECODE1 is null‘;
 40       else
 41          xSqlCommand := xSqlCommand ||‘ AND DATECODE1 = ‘‘‘|| i_datecode1 ||‘‘‘‘;
 42       end if;
 43    ELSE
 44       xSqlCommand := ‘SELECT f001 FROM MSE0306 WHERE WK_ORD_ID=‘|| i_worknosid ||‘ AND TYPE_ID=1 AND STATUS=0‘ ||
 45                     ‘ AND BIN1=‘‘‘|| i_bincode1  ||‘‘‘‘ ||‘ AND BIN2=‘‘‘|| i_bincode2 ||‘‘‘‘ ;
 46
 47             If i_datecode1 =‘‘ Then
 48                xSqlCommand := xSqlCommand || ‘ AND DATECODE1 is null‘;
 49             Else
 50                xSqlCommand := xSqlCommand || ‘ AND DATECODE1=‘‘‘|| i_datecode1 ||‘‘‘‘;
 51             End If;
 52
 53             If i_datecode2=‘‘ Then
 54                  xSqlCommand := xSqlCommand ||‘ AND DATECODE2 is null‘ ;
 55             Else
 56                  xSqlCommand := xSqlCommand ||‘ AND DATECODE2=‘‘‘|| i_datecode2  ||‘‘‘‘;
 57             End If;
 58    END IF;
 59
 60    open xCursor for xSqlCommand;
 61    LOOP
 62         FETCH xCursor INTO xmse0306_f001;
 63         EXIT WHEN xCursor %notfound ;
 64    END LOOP;
 65    close xCursor;
 66
 67    if xMse0306_f001>0 then
 68       select nvl(qty1,0),nvl(qty2,0),nvl(qty,0)
 69       into xBin1Qty_Sys,xBin2Qty_sys,xBinqty_sys
 70       from mse0306
 71       where f001 = xMse0306_f001;
 72    end if;
 73    xBin1Qty_New := xBin1Qty_Sys + i_bin1_qty;
 74    xBin2Qty_New := xBin2Qty_Sys + i_bin2_qty;
 75    xBinQty_New := xBinqty_sys + i_bin1_qty + i_bin2_qty;
 76
 77    ---处理MSE0306
 78    if xMse0306_f001 = 0 then
 79      INSERT INTO mse0306(wk_ord_id, bin1, datecode1,qty1, bin2, datecode2, qty2, qty,type_id, creat_time, creat_userid, item_partno,runsheet)
 80        VALUES (i_worknosid, i_bincode1,i_datecode1, xBin1Qty_New ,i_bincode2, i_datecode2 , xBin2Qty_New , xBinQty_New, i_iustype,sysdate, i_usersid , i_led_partno, i_pmp_bin );
 81
 82      open xCursor for xSqlCommand;
 83     LOOP
 84         FETCH xCursor INTO xmse0306_f001;
 85         EXIT WHEN xCursor %notfound ;
 86     END LOOP;
 87      close xCursor;
 88
 89     else
 90           UPDATE mse0306
 91          SET qty1=xBin1Qty_New,
 92              qty2=xBin1Qty_New,
 93              qty = xBinQty_New ,
 94              up_time = SYSDATE,
 95              up_userid = i_usersid
 96        WHERE f001 = xMse0306_f001;
 97     end if;
 98
 99         ----更新大標籤
100       UPDATE mse0304
101          SET f007 = ‘N‘,
102              f013 = xMse0306_f001,
103              f014 =i_usersid,
104              f015 = SYSDATE
105        WHERE f001 = i_bl1_sid;
106
107       IF i_iustype = 1
108       THEN
109          UPDATE mse0304
110             SET f007 = ‘N‘,
111                 f013 = xMse0306_f001,
112                 f014 = i_usersid,
113                 f015 = SYSDATE
114           WHERE f001 = i_bl2_sid;
115       END IF;
116
117       ----更新小标签,写 发料表
118    FOR l_cursor IN (SELECT m305.f003
119                       FROM mse0304 m304, mse0305 m305
120                      WHERE m304.f001 = m305.f002 AND m304.f001 = i_bl1_sid)
121    LOOP
122       xreelno := l_cursor.f003;
123
124       INSERT INTO sajet.g_part_led_issue
125                   (wk_ord_id, part_id, part_sn, upd_time, upd_uid
126                   )
127            VALUES (i_worknosid, i_led_partid , xreelno, SYSDATE, i_usersid
128                   );
129
130       UPDATE mse0305
131          SET f005 = ‘N‘
132        WHERE f003 = xreelno;
133    END LOOP;
134
135    IF i_iustype = 1
136    THEN
137       FOR l_cursor IN (SELECT m305.f003
138                          FROM mse0304 m304, mse0305 m305
139                         WHERE m304.f001 = m305.f002 AND m304.f001 = i_bl2_sid)
140       LOOP
141          xreelno := l_cursor.f003;
142
143          INSERT INTO sajet.g_part_led_issue
144                      (wk_ord_id, part_id, part_sn, upd_time, upd_uid
145                      )
146               VALUES (i_worknosid, i_led_partid, xreelno, SYSDATE, i_usersid
147                      );
148
149          UPDATE mse0305
150             SET f005 = ‘N‘
151           WHERE f003 = xreelno;
152       END LOOP;
153    END IF;
154
155 ----  DBMS_OUTPUT.PUT_LINE(‘存檔OK...‘);
156 /*
157 EXCEPTION
158   WHEN Others THEN
159    ----DBMS_OUTPUT.PUT_LINE(SQLCODE||‘---‘||SQLERRM);
160     rollback;*/
161 END;
162 /

时间: 2024-10-28 23:42:15

Oracle动态游标用法的相关文章

Oracle动态游标实现动态SQL循环遍历,和静态游标的比较。

动态游标可以遍历动态的表, 格式: TYPE 游标类型 IS REF CURSOR; --定义一个动态游标游标名 游标类型; 如果查询的表的数据不同的,动态变化的,这时候可以用动态游标. 需要注意的是,动态游标的定义, 在普通存储过程中:需要放在 is 后面的第一行. 动态游标通过:open 游标 for 字符串,形式使用,遍历. create or replace procedure P_TEST_SQL is TYPE ref_cursor_type IS REF CURSOR; --定义一

oracle动态游标

declare v_col1 varchar2(254); v_col2 varchar2(254); v_sql  varchar2(1024); type my_cursor is ref cursor; v_cur my_cursor; begin v_sql := 'select :1,:2 from dual where 1 = :3'; open v_cur for v_sql using 'col1', 'col2', 1; loop fetch v_cur into v_col1

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

Oracle异常处理,动态游标

小例子,方便以后查阅. 包头需要声明:   type C_CURSOR is ref cursor; procedure visitcount(in_date number, out_code out number, out_desc out varchar2 ) is t_date number(8); t_datepre number(8); t_sql varchar2(2000); t_tempcount number(8); c_data C_CURSOR; v_cityname va

『ORACLE』 PLSQL动态游标的使用(11g)

#静态游标指的是程序执行的时候不需要再去解析sql语言,对于sql语句的解析在编译的时候就可以完成的. 动态游标由于含有参数,对于sql语句的解析必须要等到参数确定的时候才能完成. 从这个角度来说,静态游标的效率也比动态游标更高一些. #游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然后来进行操作. 实质: 是用户在远程客户端上对服务器内存区域的操作

[转]ORACLE的ProC用法讲解

pro*c是高级的用法,OCI是oracle的基础用法 如何编译.pc文件: proc code=cpp  parse=none iname=filename.pc oname=filename.cpp 一, 首先要包涵头文件#include 这个头文件 二,  在声明宿主变量之前一定要先定义struct sqlca sqlca;这个变量. 三, 所有与oracle数据库SQL语句有关的变量必须在前面声明为宿主变量分配空间才可以使用, 宿主变量只能是oracle支持的数据类型,一般是基本类型的,

Oracle基础 游标

一.游标 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集. 为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区.这个区包含了已经处理完的行数.指向被分析语句的指针,整个区是查询语句返回的数据行集.游标就是指向上下文区句柄或指针. 二.游标的分类: 1.静态游标:静态游标是在编译时知道其SELECT语句的游标.静态游标又分为两种类型,隐式游标和显示游标. 2.动态游标:用户为游标使用的查询直到运行的时候才

Oracle 动态SQL语句

Oracle 动态SQL语句 (2012-06-18 16:36:12) 转载▼ 标签: oracle it   EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQLpackage包. 它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTEIMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTEIMMEDIATE,因为它获的收益在包

Oracle 基础 游标

一:游标的基本原理 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集. 为了处理SQL语句,Oracle将在内存中分配一个区域,这就是上下文区.这个区包含了已经处理完的行数.指向被分析语句的指针,整个区是查询语句返回的数据行集.游标就是指向上下文区句柄或指针. 二:游标的分类 1.静态游标:在编译时知道其SELECT语句的游标. (1).显示游标 (2).隐式游标 2.动态游标:用户为游标使用的查询直到运行的时候才能确定,必