日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

4GL之Non-SCROLLING CURSOR

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

總結

以上是生活随笔為你收集整理的4GL之Non-SCROLLING CURSOR的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。