【实习之T100开发】Genero FGL (TIPTOP4GL) 学习笔记(2)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

执行完 CONSTRUCT 后,系统只能得到一个 SQL 字符串,并非为『可执行的指令』,因此必须通过 PREPARE 指令,将此 SQL 字符串转换成『可执行的 SQL 指令』。

PREPARE 会将字符串传入数据库查核语法的正确性,再回传一个 prepared-id 后续调用。

在这里插入图片描述

  • statement-name 是一个 PREPARE 完成后的 可执行SQL(prepared-id)

  • 执行 PREPARE 指令前必须先拼接好 SELECT 语句。

LET l_sql = “SELECT * FROM employee_file”,

“WHERE”, l_str # l_str 是经过 CONSTRUCT 得到的【WHERE条件】

PREPARE emp_pre FROM l_sql

FREE:释放 PREPARE 的记录


FREE 用于 释放 PREPARE 的记录

语法:FREE statement-name

LET l_str = " employee=‘1000’ AND salary>‘30000’ "

LET l_sql = " SELECT * FROM employee_file WHERE ", l_str

PREPARE emp_pre FROM l_sql

FREE emp_pre

数据的查询


Genero FGL 中有两种查询用的指标(CURSOR)可以运用在资料的查询

  1. SCROLLING CURSOR

  2. Non-SCROLLING CURSOR

SCROLLING CURSOR 通常运用在 单文件控制 或 查询类 的程序,如『个人资料表』般的作业,可以随机抓取数据,一次一笔,再处理完后可以选择 往前一比往后一笔往这个查询序列中的任何一笔数据 移动的指针(CURSOR)。

DECLARE cursor_id SCROLL CURSOR [WITH HOLD] FOR sql statement

OPEN cursor_id [USING value]

FETCH [first|last|previous|next| cursor_id INTO variable

CLOSE cursor_id

Non-SCROLLING CURSOR 通常运用在 双文件控制程序 或 报表 程序,如『个人出缺勤统计表』般的作业,抓取数据是 依序 (seguential) 的方式,一次可以将合条件要求的资料一笔接着一笔的抓出,直到资料全数抓完(或被强制终止)为止。

DECLARE cursor_id CURSOR [WITH HOLD] FOR sql statement

FOREACH cursor_id

[USING value]

[INTO variable ]

END FOREACH

SCROLLING CURSOR(DECLARE、OPEN、FETCH、CLOSE)

说明:通常用于 查询程序,可以 随即抓取资料

  1. 通过 DECLARE 定义

  2. 利用 OPEN 开启该 CURSOR

例:OPEN test01_cursor

  1. 通过 FETCH cursor_name INTO 变量 抓取资料

DECLARE 概述

语法1:使用 已知的SQL语句 进行 CURSOR 声明

DECLARE cursor_name SCROLL CURSOR [WITH HOLD]

FOR sql_statement

语法2:使用 已声明的PREPARED ID 来进行 CURSOR 声明

DECLARE cursor_name SCROLL CURSOR [WITH HOLD]

FOR prepared_id

语法3:使用 已知的STRING语句 进行 CURSOR 声明

DECLARE cursor_name SCROLL CURSOR [WITH HOLD]

FROM string-expression

在这里插入图片描述

OPEN 概述

语法:

OPEN cursor_name [USING 变量名称]

  • 本指令可用 STATUS 来检查是否执行成功

  • 使用 cursor 之前要先 OPEN CURSOR,开启游标

  • 此语句仅决定符合的数据,并不是真正从数据库中抓取数据

示例:

LET g_sql = “SELECT * FROM cta_file WHERE ROWID = ?”

DECLARE cta_cl CURSOR FROM g_sql

:

OPEN cta_cl USING l_ata01

FETCH 概述

语法:

FETCH cursor_id INTO program_variable

当声明为 SCROLLING CURSOR 时,可以配合以下移动 Cursor 的指令:

在这里插入图片描述

不同 FETCH 指令下 CURSOR 动作示意图:

在这里插入图片描述

LET l_sql = “SELECT * FROM employee_file”, “WHERE”, l_str

PREPARE emp_pre FROM l_sql

DECLARE emp_cus SCROLL CURSOR

[WITH HOLD] FOR emp_pre

OPEN emp_cus # OPEN CURSOR

FETCH FIRST emp_cus INTO l_emp.* #抓第一笔

CLOSE 概述

语法:

CLOSE cursor_id

说明:关闭并释放指标(CURSOR)的储存空间


综合示例

DATABASE ds #声明数据库

MAIN

DEFINE a STRING

DEFINE b,c CHAR(10)

使用 SQL语句 声明 CURSOR

DECLARE test01 SCROLL CURSOR FOR

SELECT zz01 FROM zz_file WHERE zz01 = “axmt410”

OPEN test01

FETCH FIRST test01 INTO b #将cursor指向符合条件的第一笔

DISPLAY b

LET c = “axmt410”

LET a = “SELECT zz01 FROM zz_file WHERE zz01='”,c CLIPPED,"’ "

使用 STRING语句 声明 CURSOR

DECLARE test02 SCROLL CURSOR FROM a

OPEN test02

FETCH LAST test02 INTO b #将cursor指向符合条件的最后一笔

DISPLAY b

END MAIN

Non-SCROLLING CURSOR(DECLARE、FOREACH)

说明:常运用在 报表程式,抓取资料的方式是 依序 (seguential) 的方式。

  1. 通过 DECLARE 定义

  2. 利用 FOREACH 指令抓资料

DECLARE 概述

语法1:使用 已知的SQL语句 进行 CURSOR 声明

DECLARE cursor_name CURSOR [WITH HOLD]

FOR sql_statement

语法2:使用 已声明的 PREPARED_ID 来进行 CURSOR 声明

DECLARE cursor_name CURSOR [WITH HOLD]

FOR prepared_id

语法3:使用 已知的STRING语句 进行 CURSOR 声明

DECLARE cursor_name CURSOR [WITH HOLD]

FROM string-expression

FOREACH (LOOP) 概述

注:只能用于 Non_Scrolling Cursor

在这里插入图片描述

声明完 CURSOR 后即可用 FOREACH 进行将所有符合条件的数据一笔一笔的抓取出来处理,不需要 OPEN。

FOREACHFETCH 的不同

  • FOREACH 具有循环处理的架构,而 FETCH 则必须配合 WHILE 循环一起用。
  • FOREACH 只能循序处理,而 FETCH 可做随机跳跃的选取。
  • 执行 FETCH 前必须 OPEN,结束时 CLOSE 关闭并释放CURSOR
**FOREACH 指令可自动开启与关闭 CURSOR**,无需手动 OPEN 和 CLOSE。

综合示例

LET l_sql = “SELECT * FROM employee_file”, “WHERE”, l_str

PREPARE emp_pre FROM l_sql

DECLARE emp_cus CURSOR FOR emp_pre # 使用 prepare_id 来声明 cursor

FOREACH emp_cus INTO l_emp.* #循序抓资料

IF l_emp.salary > 80000 THEN

EXIT FOREACH

END IF

END FOREACH

MAIN

DEFINE clist ARRAY[200] OF RECORD

cnum INTEGER,

cname CHAR(50)

END RECORD

DEFINE I INTEGER

DEFINE str STRING

DEFINE c_name CHAR(50)

DATABASE stores

LET c_name = ARG_VAL(1)

LET str = “SELECT customer_num, cust_name FROM customer WHERE cname = ?”

PREPARE prepare_id FROM str

DECLARE c1 CURSOR FOR prepare_id # 使用 prepare_id 来声明 cursor

LET i = 1

FOREACH c1 USING c_name INTO clist[i].*

LET i = i + 1

END FOREACH

DISPLAY "Number of rows found: ", i

END MAIN

数据的锁定


LOCKING CURSOR(DECLARE、OPEN、FETCH、CLOSE)

当要进行数据的修改 (UPDATE) 时,为防止多人同时修到同一笔数据,应当考虑在开始修改前进行 数据锁定(LOCK),以确保同时间只有一人能取得修改权,Genero FGL 中延续 INFORMIX 4GL 的作法,采用 LOCKING CURSOR 对数据进行锁定。

LOCKING CURSOR 也称 FOR UPDATE CURSOR。用于在数据更新程序段,将数据进行一个上锁的动作,以避免两组以上的联机同时再更新同一 TABLE 下的同一笔数据。如果未作 LOCK 的动作,可能再抓取数据的同时,有其他人正在进行数据修改。此 CURSOR 不属于数据查询的 CURSOR,而需列为更新的 CURSOR。

DECLARE cursor_name CURSOR FOR sql statement FOR UPDATE [NOWAIT]

OPEN cursor_id [USING value]

FETCH cursor_id INTO variable

CLOSE cursor_id

说明:通常运用在 Update程序,做资料Lock的动作。

  1. 通过 DECLARE 定义

  2. 通过 OPEN 开启该CURSOR

  3. 通过 FETCH cursor_name INTO 变量 抓取资料

DECLARE 概述

DECLARE cursor_name CURSOR FOR select_statement FOR UPDATE [NOWAIT]

  • 此处与 SCROLL CURSOR 或 Non-SCROLL CURSOR 最大的差异在于 SQL 查询指令的

最后须加上FOR UPDATE(ORACLE 数据库需再加上 NOWAIT),以标明此 CURSOR 为 LOCKING CURSOR。

  • 此处亦可使用 FROM char_variable 方式来定义 SQL 查询指令。

OPEN 概述

OPEN cursor_id

FETCH 概述

FETCH cursor_id INTO program_variable

  • 此指令除从数据库中取得数据外,在 LOCKING CURSOR 的状态下,还会将所抓取到的数据锁住,直到程序执行 CLOSE cursor_id 的指令才会释放。

CLOSE 概述

CLOSE cursor_id

  • 关闭并释放 CURSOR,待释放完成后,系统才会将被锁定的数据释放

综合案例

LET l_sql = “SELECT * FROM employee_file”,

“WHERE no = ? FOR UPDATE”

PREPARE emp_pre FROM l_sql

DECLARE emp_cl CURSOR FOR emp_pre

OPEN emp_cus USING l_no

FETCH emp_cus INTO l_emp.* #只抓一笔资料lock

DATABASE ds

MAIN

DEFINE g_gav01 LIKE gav_file.gav01

DEFINE g_gav08 LIKE gav_file.gav08

LET g_forupd_sql = "SELECT * from gav_file WHERE gav01=? AND gav08=? ",

“FOR UPDATE”

DECLARE p_per_lock_u CURSOR FROM g_forupd_sql

OPEN p_per_lock_u USING g_gav01,g_gav08

IF STATUS THEN

CLOSE p_per_lock_u

RETURN

END IF

FETCH p_per_lock_u INTO g_gav_lock.*

IF SQLCA.sqlcode THEN

CLOSE p_per_lock_u

RETURN

END IF

CLOSE p_per_lock_u

END MAIN

USING的使用时机

此处的『USING』和之前关于 变量格式输出的 USING 意义不同。

在组成查询的 SQL 指令时,有时一开始不知道要查询的数据是什么 ,因此『可在 SQL 查询指令中使用问号 ?,后续要使用 CURSOR 时,再将已知值用 USING 传入』。

说明

  • SQL 语句中可以定义多个问号?;使用 USING 给值时需依序对应,并用逗号隔开

  • USING 必需跟在 OPEN 后 (Scroll Cursor 及 Locking Cursor种)、FOREACH 后 (Nonscroll Cursor) 或 EXECUTE 指令后 (大量执行 SQL Cursor)

前面的案例中都用到了 USING。

TRANSACTION:事务控制


说明:需要多表格的同时连动时,可采用 TRANSACTION 作法。

  1. 通过 BEGIN WORK 声明 TRANSACTION 开始

  2. 执行 INSERT、UPDATE、DELETE 等指令

  3. 通过 COMMIT WORKROLLBACK WORK 声明 TRANSACTION 结束

注意

  • BEGIN WORK 开始后,一定要有 COMMIT WORKROLLBACK WORK

也就是必须做出数据是否写入的判断

  • TRANSACTION 区中的程序尽量不要太长,以免影响需要调用同笔数据的其他用户

(但使用者本身不受影响,未 COMMIT WORK 前仍可调用已变更数据)

  • 有些 DDL 指令 (如 CREATE TABLE) 会有自动 COMMIT WORK 功能

  • COMMIT WORKROLLBACK WORK 时,会自动关闭未声明『WITH HOLD』的 CURSOR

BEGIN WORK

[INSERT …]

[UPDATE …]

IF SQLCA.SQLCODE THEN #SQL执行结果

ROLLBACK WORK

ELSE

COMMIT WORK

END IF

EXECUTE:大量执行同一SQL指令


当系统要执行大量的同一 SQL 指令,例如要在工作数据中连续 INSERT 十年的工作日数据,可以用 FOR 循环实现以下语句,但数据量大时效率会比较低。

INSERT INTO work_date VALUES (“2005/07/01”, “Friday”, “Weekday”)

若对程序有效率要求,则可以考虑改用『EXECUTE』作法。

说明:需要大量执行同一SQL指令。

  • EXECUTE 可以应用在 SELECT、UPDATE、INSERT、DELETE 等处

  • 使用 EXECUTE 时,尽量将以 USING 方式传值

FUNCTION update_customer_name( key, name )

DEFINE key INTEGER

DEFINE name CHAR(10)

PREPARE s1 FROM “UPDATE customer SET name=? WHERE customer_num=?”

EXECUTE s1 USING name, key

FREE s1

END FUNCTION

PUT…FLUSH:大量执行新增指令


若是需要大量 INSERT 操作,『INSERT CURSOR』比 EXECUTE 更快。

在这里插入图片描述

示例:

MAIN

DEFINE i INTEGER

DEFINE rec RECORD

key INTEGER,

name CHAR(30)

END RECORD

DATABASE stock

PREPARE is FROM “INSERT INTO item VALUES (?,?)”

DECLARE ic CURSOR FOR is

BEGIN WORK # 开启事务

OPEN ic

FOR i=1 TO 100

LET rec.key = i

LET rec.name = “Item #” || i

PUT ic FROM rec.*

分享

这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

Spring Cloud实战

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

Spring Boot实战

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
F,t_70)

示例:

MAIN

DEFINE i INTEGER

DEFINE rec RECORD

key INTEGER,

name CHAR(30)

END RECORD

DATABASE stock

PREPARE is FROM “INSERT INTO item VALUES (?,?)”

DECLARE ic CURSOR FOR is

BEGIN WORK # 开启事务

OPEN ic

FOR i=1 TO 100

LET rec.key = i

LET rec.name = “Item #” || i

PUT ic FROM rec.*

分享

这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

[外链图片转存中…(img-varvNvvo-1713439560312)]

Spring Cloud实战

[外链图片转存中…(img-03bqIA0g-1713439560313)]

Spring Boot实战

[外链图片转存中…(img-KiESBpC4-1713439560313)]

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-7myI0uGP-1713439560314)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值