我在 Oracle 表单中需要编写一个 PLSQL 块,该块将通过包含逗号分隔记录的游标从数据库中读取。我已经完成了逻辑,但想检查我开发的这个逻辑是否可以以任何方式改进。
DECLARE
CURSOR vest_hist (p_ind_id NUMBER,
p_plan_id NUMBER)
IS
SELECT narrative
FROM dummy_ev_tbld
WHERE subject_id = p_ind_id
AND sub_subject_id = p_plan_id
AND evty_code = 'VEDC'
ORDER BY dpdate_time;
v_narrative dummy_ev_tbld.narrative%TYPE;
v_hire_date DATE;
v_ev_id NUMBER(10);
v_step_seqnbr NUMBER(3);
v_credited_hours NUMBER(10);
BEGIN
OPEN vest_hist(123,
123);
LOOP -- looping for the child ga_id's
FETCH vest_hist INTO v_narrative;
EXIT WHEN vest_hist%notfound;
v_hire_date := NVL(SUBSTR(v_narrative,INSTR(v_narrative,',',1,3)+1,INSTR(v_narrative,',',1,4)-INSTR(v_narrative,',',1,3)-1),'N/A');
v_ev_id := NVL(SUBSTR(v_narrative,INSTR(v_narrative,',',1,4)+1,INSTR(v_narrative,',',1,5)-INSTR(v_narrative,',',1,4)-1),'N/A');
v_step_seqnbr := NVL(SUBSTR(v_narrative,INSTR(v_narrative,',',1,5)+1,INSTR(v_narrative,',',1,6)-INSTR(v_narrative,',',1,5)-1),'N/A');
v_credited_hours := NVL(SUBSTR(v_narrative,INSTR(v_narrative,',',1,9)+1,INSTR(v_narrative,',',1,10)-INSTR(v_narrative,',',1,9)-1),'N/A');`your text`
/*DO SOMETHING with these variables......*/
END LOOP;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('E-1526-0004-0038-'||SQLCODE||':Contact Systems');
RAISE FORM_TRIGGER_FAILURE;
END;
所以我使用 substr 和 instr 来分割叙述数据,然后将它们存储在各自的变量中。那么有什么方法可以通过一个查询或逻辑来完成它吗?
v_narrative 数据:14-JUL-2019,92149,1,10
有几件事你可以注意一下。
第一个是您发布的代码由于
NVL
函数调用而无法工作。其中一个局部变量是 DATE
,其余的都是 NUMBER
,并且您不能将 N/A
放入其中任何一个变量中,因为那是一个字符串。
此外,您是否确定 - 对于样本
narrative
值(14-JUL-2019,92149,1,10
),您的子字符串返回正确的值?您正在寻找例如其中第 9 次或第 10 次出现逗号字符。那里没有那么多逗号。
至于异常处理程序:虽然它不会失败,但它不会执行任何操作,因为 Oracle Forms 无法显示
dbms_output.put_line
的输出。使用内置的message
(调用两次,以便在屏幕上的弹出窗口中显示,或切换到警报。
如何简化该代码?摆脱显式声明的游标、游标变量、局部变量,打开游标(然后关闭它 - 这是你失败的事情),担心退出循环并切换到游标循环。
这里有一个建议,展示了替代方法。for