首页 > 4GL之Non-SCROLLING CURSOR

4GL之Non-SCROLLING CURSOR

在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來寫了。

转载于:https://www.cnblogs.com/duolaAmengblog/p/8430440.html

更多相关:

  • 我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加、修改、删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃力,翻遍网上的资料,找不到几个正确的并能执行的循环处理数据的方法,在这里,我来给大家分享一下! 要SQL中写类似for循环,我这里使用的...

  • cursor:hand 与 cursor:pointer 的效果是一样的,都像光标指向链接一样,光标变成手行。 cursor:hand :IE完全支持。但是在firefox是不支持的,没有效果。 cursor:pointer :是CSS2.0的标准。所以firefox是支持的,但是IE5.0既之前版本不支持。IE6开始支持。 结论:还...