Reg:查询更改

问题描述 投票:0回答:1

我在 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

oracle plsql oracleforms
1个回答
0
投票

有几件事你可以注意一下。

第一个是您发布的代码由于

NVL
函数调用而无法工作。其中一个局部变量是
DATE
,其余的都是
NUMBER
,并且您不能将
N/A
放入其中任何一个变量中,因为那是一个字符串。

此外,您是否确定 - 对于样本

narrative
值(
14-JUL-2019,92149,1,10
),您的子字符串返回正确的值?您正在寻找例如其中第 9 次或第 10 次出现逗号字符。那里没有那么多逗号。

至于异常处理程序:虽然它不会失败,但它不会执行任何操作,因为 Oracle Forms 无法显示

dbms_output.put_line
的输出。使用内置的
message
(调用两次,以便在屏幕上的弹出窗口中显示,或切换到警报。

如何简化该代码?摆脱显式声明的游标、游标变量、局部变量,打开游标(然后关闭它 - 这是你失败的事情),担心退出循环并切换到游标循环。

这里有一个建议,展示了替代方法。

for

© www.soinside.com 2019 - 2024. All rights reserved.