规则1:不允许将多行语句书写在同一行;
示例
如下代码不符合规范(将两行定义书写在同一行)
SET v_count = 1; SET v_creation_date = CURRENT_DATE;
如下代码符合规范
SET v_count = 1;
SET v_creation_date = CURRENT_DATE;
规则2:相对独立的程序块之间应加空行;
示例
如下代码不符合规范(变量定义和程序段之间无空行)
SET v_duty_id = 1;
IF (v_disabled_date > v_current_date) THEN
SELECT duty_name
into v_duty_name
FROM sm_duty
WHERE duty_id = :duty_id;
…
END IF;
如下代码符合规范
SET v_duty_id = 1;
IF (v_disabled_date > v_current_date) THEN
SELECT duty_name
into v_duty_name
FROM sm_duty
WHERE duty_id = :duty_id;
…
END IF;
规则3:当一个SQL 语句中涉及到多个表时,始终使用别名来限定字段名,这使其它人阅读起来更方便,避免了含义模糊的引用,其中能够通过别名清晰地判断出表名;
说明 : 别名命名时,尽量避免使用无意义的代号a、b 、c… , 而应该有意义( 如表mtl_system_items_b
对应别名为msi,po_headers_all 别名对应为pha)。
示例
如下语句不符合规范(未使用有明确含义的表别名)
SELECT a.wip_entity_name, a.wip_entity_id, a.date_released
FROM wip.wip_entities b,
wip.wip_discrete_jobs a
WHERE b.wip_entity_id = a.wip_entity_id
AND a.status_type = 3
如下语句符合规范
SELECT wdj.we_entity_name, wdj.wip_entity_id, wdj.date_released
FROM wip.wip_entities we,
wip.wip_discrete_jobs wdj
WHERE we.wip_entity_id = wdj.wip_entity_id
AND we.status_type = 3
规则4:确保变量/参数的类型和长度与表数据字段的类型和长度相匹配;
说明:如果与表数据列宽度不匹配,则当较宽或较大的数据传进来时会产生运行异常。
示例
如下代码不符合规范(假定表wap_user的字段user_name的定义为VARCHAR(10))
CREATE PROCEDURE ps_add()
BEGIN
DECLARE v_user_name VARCHAR(15);
UPDATE wap_user
SET user_name = v_user_name
WHERE sky_id = 100;
END;
如下代码符合规范
CREATE PROCEDURE ps_add()
BEGIN
DECLARE v_user_name VARCHAR(10);
UPDATE wap_user
SET user_name = v_user_name
WHERE sky_id = 100;
END;
规则5:存储过程代码块必须有注释;
建议1:减少控制语句的判断次数,比如在ELSE(IF…ELSE)语句中,尽量将尽快能检测到结果的判断放在前面;
示例
如下语句不符合规范(假定v_count=1的条件大多数情况会满足)
IF (v_count = 0) THEN
NULL;
ELSEIF (v_count = 1) THEN
NULL;
END IF;
如下语句符合规范(假定v_count=1的条件大多数情况会满足)
IF (v_count = 1) THEN
NULL;
ELSEIF (v_count = 0) THEN
NULL;
END IF;
建议2:尽量避免使用嵌套的IF语句,在这种情况下应使用多个IF语句来判断其可能性;
示例
如下语句不符合规范(使用了嵌套的IF语句来进行判定)
IF v_count = 0 THEN
IF v_flag = 0 THEN
NULL;
ELSE
NULL;
END IF;
ELSE v_count = 1 THEN
IF v_flag = 0 THEN
NULL;
ELSE
NULL;
END IF;
END IF;
如下语句符合规范
IF (v_count = 0) AND (v_flag = 0) THEN
NULL;
ELSEIF (v_count = 0 ) AND (v_flag = 1) THEN
NULL;
ELSEIF (v_count = 1) AND (v_flag = 0) THEN
NULL;
ELSEIF (v_count = 1) AND (v_flag = 1) THEN
NULL;
END IF;
建议3:存储过程、函数、触发器、程序块中定义的变量和输入、输出参数在命名上有所区分;
说明:
用'v_ '开头代表程序块中定义的普通变量。
用'p_ '开头代表输入参数变量。
用'x_ '开头代表输入输出或输出参数变量。
用'cur_'开头代表游标变量。存放游标记录集。
相关文章
订阅评论
登录
请登录后发表评论
0 评论
最旧