oracle 注册:查询变更

k7fdbhmy  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(72)

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

8fsztsew

8fsztsew1#

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

begin
   for cur_r in 
     (select to_date(substr(narrative, 1, 11), 'dd-mon-yyyy', 'nls_date_language = english') hire_date,
       substr(narrative, instr(narrative, ',', 1, 1) + 1,
                   instr(narrative, ',', 1, 2) - instr(narrative, ',', 1, 1) - 1
             ) ev_id,
       substr(narrative, instr(narrative, ',', 1, 2) + 1,
                   instr(narrative, ',', 1, 3) - instr(narrative, ',', 1, 2) - 1
             ) step_seqnbr,
       substr(narrative, instr(narrative, ',', 1, 3) + 1) credited_hours             
      from dummy_ev_tbld
   ) loop
     null;
     -- do something with values returned by cursor. Reference them as e.g.
     -- if cur_r.hire_date is null then ...
  end loop;
exception
  when others then
    message('E-1526-0004-0038-'||SQLCODE||':Contact Systems');
    raise form_trigger_failure;
end;
/

相关问题