4GL之Non

Wesley13
• 阅读 678

在4gl中CURSOR可以说是每一个程序中都会有的,而CURSOR又分为三种SCROLLING CURSOR、Non-SCROLLING CURSOR、LOCKING CURSOR。

Non-SCROLLING CURSOR的聲明有兩種,一種是先定義好sql語句到一個變量里:

DECLARE    cursor名  CURSOR  FROM  變量

另一種是直接將sql語句寫在CURSOR聲明裡面:

DECLARE    cursor名  CURSOR  FOR   SQL語句

抓取資料:FOREACH  cursor名  INTO  變量或者集合或者數組

               在循環內可用的控制 [CONTINUE FOREACH][EXIT FOREACH]

              END FOREACH

Non-SCROLLING CURSOR抓取到的資料,是放在一個數組內的,因為抓取到的資料是一次一筆資料。每抓取一筆后,再抓第二筆時,由於數組可以定義成二維數組,所以能夠接受到所有資料。

如果是將資料放在變量或者集合內,那麼每次抓取到的資料都會覆蓋掉變量或集合內的值,這種情況只能在循環里將資料取出,否則只會保留最後一筆資料。

總的來說,Non-SCRCOLLING CURSOR的循環類似FOR循環。

以下為廢話

Non-SCROLLING CURSOR通常出現在雙檔控制程序或者報表程序裡面,抓取資料時,可以按次序,一次一筆資料抓取,直到強制終止或全部抓取完畢。Non-SCROLLING CURSOR的循環體為(FOREACH  循環體  END FOREACH),循環體中,常見的都是一些對SQL語句的執行情況的判斷:有判斷SQLCA.SQLCODE、STATUS的值的,還有這種少見的

DECLARE p111_chkdate CURSOR WITH HOLD FOR p111_prechk

LET l_flag='N'

FOREACH p111_chkdate INTO l_yy,l_mm

    LET l_flag='Y' EXIT FOREACH

END FOREACH

IF l_falg = 'Y' THEN

      CALL cl_err('err: ' , ' 報錯代碼 ',1)  RETURN

END IF

循環體內看出,只抓了一筆資料就設定了變量值,然後退出循環,通過檢查設定的值,產生報錯信息,并退出這段控制。那麼這個CURSOR的意思是從數據庫中抓取資料,若抓出了資料,就報錯,感覺上有點多此一舉。

后腦子抽風,猜想起如果CURSOR沒有抓取到資料,就是說sql語句抓取不到資料,而控制段里面又是用的這種寫法,那麼,循環會執行嗎?

於是:

DATABASE ds
MAIN
    DEFINE l_sql VARCHAR(500)
    DEFINE l_zz01 LIKE zz_file.zz01
    DEFINE l_zz04 LIKE zz_file.zz04
    DEFINE l_flag VARCHAR(2)
    DEFINE l_cnt INTEGER
    DEFINE l_count INTEGER
    LET l_cnt = 1
    LET l_flag = 'N'
    
    select count(*) INTO l_count from zz_file where zz06='2'
    LET l_sql=" SELECT zz01,zz04 ",
              " FROM zz_file ",
              " WHERE zz06='99' ",
              " ORDER BY 1 desc "     #這條語句沒有資料抓取
    PREPARE zz_sql FROM l_sql
    DECLARE zz_cur CURSOR WITH HOLD FOR zz_sql
    FOREACH zz_cur INTO l_zz01,l_zz04
        LET l_flag='Y'
        LET l_cnt=l_cnt+1
        #DISPLAY l_zz01
        EXIT FOREACH
    END FOREACH
    DISPLAY l_count       #123
    DISPLAY l_cnt           #1
    DISPLAY l_flag          #N
    DISPLAY l_zz01         #空
    DISPLAY l_zz04         #空
END MAIN

然後去編譯執行,果然,沒有抓取到資料,是不會執行循環體的;果然每個人有每個人的寫法,但這種有資料就報錯的就沒有必要用cursor來寫了。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
DOIS 2019 DevOps国际峰会北京站来袭~
DevOps国际峰会是国内唯一的国际性DevOps技术峰会,由OSCAR 联盟指导、DevOps时代社区与高效运维社区联合主办,共邀全球80余名顶级专家畅谈DevOps体系与方法、过程与实践、工具与技术。会议召开时间:2019070508:00至2019070618:00结束会议召开地点:北京主办单位:DevOps
Wesley13 Wesley13
3年前
oracle游标的例子
declare    cursor ca is select id_no, name from user where ym201401;begin    for cb in ca loop        update path set enamecb.name where id_nocb.id
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这