【问题标题】:Oracle REFCURSOR error with declare and setting up variablesOracle REFCURSOR 错误与声明和设置变量
【发布时间】:2016-01-13 08:35:20
【问题描述】:

我对 Oracle 比较陌生,我使用 sql server 多年。我一直试图让光标循环工作。我在函数中找到了一个示例,但为了测试,我还不想创建函数。

我希望这种类型的语法可以工作,我做错了什么?我正在使用 PL/SQL Developer

declare 
c_actual REFCURSOR;  
v_crkt_nb log_step_circuit.crkt_nb%TYPE;
v_string  VARCHAR2(50);

v_string := '';

open c_actual for 

SELECT 
  u.LGN_ID_NM 
  FROM work_folder f,
   trouble_call    t,
   doc_log_step    d,
   impacted_device i,
   user_assignment a,
   user_role       r,
   oms_user        u,
   service_location s
 WHERE t.impct_dev_k = i.impct_dev_k
    and i.doc_log_stp_k = d.doc_log_stp_k
    and d.work_fldr_k = f.work_fldr_k
    and s.locatn_k = t.locatn_k
    and f.work_fldr_k = a.work_fldr_k
    and a.user_role_k = r.user_role_k
    and FOLDER_PKG.TroubleCallCount(f.work_fldr_k) = 1
    and r.lgn_id_nm = u.lgn_id_nm
    AND t.oms_tcall_k = 563815
    and f.work_fldr_k in
    (select work_fldr_k
      from work_folder
     WHERE work_folder.fldr_stts_c in ('NEW', 'IN PROGRESS'))
     AND ROLE_C = 'TRBLSHTR' and a.unasn_d is null;

     LOOP
       FETCH c_actual INTO v_crkt_nb;
     EXIT WHEN c_actual%NOTFOUND;  

     v_string := substr(v_string || v_crkt_nb || '  ',1, 50);
     END LOOP;

     v_string := trim(v_string);

     CLOSE c_actual;

【问题讨论】:

    标签: oracle plsql cursor ref-cursor


    【解决方案1】:

    请看下面。

    declare 
    v_crkt_nb log_step_circuit.crkt_nb%TYPE;
    v_string  VARCHAR2(500);
    cursor c1 is
      SELECT u.LGN_ID_NM 
      FROM work_folder f,
       trouble_call    t,
       doc_log_step    d,
       impacted_device i,
       user_assignment a,
       user_role       r,
       oms_user        u,
       service_location s
     WHERE t.impct_dev_k = i.impct_dev_k
        and i.doc_log_stp_k = d.doc_log_stp_k
        and d.work_fldr_k = f.work_fldr_k
        and s.locatn_k = t.locatn_k
        and f.work_fldr_k = a.work_fldr_k
        and a.user_role_k = r.user_role_k
        and FOLDER_PKG.TroubleCallCount(f.work_fldr_k) = 1
        and r.lgn_id_nm = u.lgn_id_nm
        AND t.oms_tcall_k = 563815
        and f.work_fldr_k in
        (select work_fldr_k
          from work_folder
         WHERE work_folder.fldr_stts_c in ('NEW', 'IN PROGRESS'))
         AND ROLE_C = 'TRBLSHTR' and a.unasn_d is null;
    Begin
    v_string := '';
    
    FOR i in c1
    
         LOOP
    
           EXIT WHEN c1%NOTFOUND;  
    
           v_string := substr(v_string || v_crkt_nb || '  ',1, 50);
         END LOOP;
    
         v_string := trim(v_string);
    
    end;
    /
    

    希望对你有所帮助。

    【讨论】:

    • 总体不错的答案。对于 OP,我会尝试解释您这样做的原因和原因,以便他们了解他们做错了什么。他们可能还想摆脱 EXIT WHEN c1%NOTFOUND;不需要,然后使用 pl/sql 使用 File-New-Test Window 并添加 dbms_output.put_line(v_string);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多