我在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 VARCHAR2(11);
v_ev_id VARCHAR2(10);
v_step_seqnbr VARCHAR2(3);
v_credited_hours VARCHAR2(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数据:2019年7月14日,92149,1,10
1条答案
按热度按时间8fsztsew1#
有几件事你可以注意一下。
第一个是你发布的代码由于
NVL
函数调用而无法工作。其中一个局部变量是DATE
,其余的都是NUMBER
,你不能把N/A
放进去,因为那是一个字符串。此外,你 * 确定 * 对于样本
narrative
值(14-JUL-2019,92149,1,10
),你的 * 子字符串 * 返回正确的值吗?您正在搜索例如第9次或第10次出现逗号字符。这里没有那么多逗号。从异常处理程序开始:虽然它不会失败,但它不会做任何事情,因为Oracle Forms无法显示
dbms_output.put_line
的输出。使用内置的message
(调用两次,以便在屏幕上的弹出窗口中显示,或切换到警报。如何简化这段代码?摆脱显式声明的游标,游标变量,局部变量,打开游标(并关闭它-这是你未能做到的),担心退出循环并切换到游标
for
循环。这里有一个建议,它表明了做这件事的另一种方法。