【问题标题】:Error with Query SELECT in cursor游标中的查询 SELECT 错误
【发布时间】:2012-11-02 21:20:39
【问题描述】:

我的光标选择有问题。选择在其他窗口中正常工作,但我在使用光标的过程中出现错误,为什么? 我更改了表和数据库的名称,但在此过程之外选择是可以的

我的错误: PL/SQL:ORA-04052: ORA-00604: ORA-03106:

CREATE OR REPLACE PROCEDURE ChangeDismissDate
IS
BEGIN
    DECLARE
          v_id VARCHAR2(40);
          v_dateABC DATE;
          v_dateDismiss DATE;
        CURSOR cur IS
                select emp.EMP_NO, abc.date, emp.DISMISS_DATE  
                from  bazaabc.EmployeesDetails@BAZA_ABC abc,
                      employee_tab emp,
                      person_info_tab pin,
                      oracle_account oa
                where bhd.emp_no = emp.EMP_NO
                and   pin.PERSON_ID = emp.EMP_NO
                and   oa.USERNAME = pin.USER_ID
                and   emp.EMP_NO in (    
                select pi.PERSON_ID from tab_person pi
                where fu.active = 'TRUE'
                and   fu.IDENTITY = pi.USER_ID) AND emp.EMP_NO like '%L%'
                and nvl(abc.date,to_date('20491231','yyyymmdd')) <> nvl(emp.DISMISS_DATE,to_date('20491231','yyyymmdd'));

        BEGIN
                       OPEN cur;
                           LOOP
                                FETCH cur INTO v_id,v_dateABC,v_dateDismiss;

                                 DBMS_OUTPUT.PUT_LINE('v_id:  ' || v_id);
                                 DBMS_OUTPUT.PUT_LINE('v_dateABC:  ' || v_dateABC);
                                 DBMS_OUTPUT.PUT_LINE('v_dateDismiss:  ' ||v_dateDismiss );

                           EXIT WHEN cur%NOTFOUND;
                           END LOOP;
                       CLOSE cur;
        END;

END;
/

【问题讨论】:

  • 您遇到什么类型的错误?
  • 好的,我编辑帖子,我写了错误
  • 我猜这与权限有关。执行 plsql 过程时检查您通过 dblink 访问的表是否具有权限
  • 权限我认为没问题,因为这个选择它在这个过程之外工作

标签: select plsql cursor procedure


【解决方案1】:

您可以通过添加异常块来尝试解决您遇到的错误

CREATE OR REPLACE PROCEDURE ChangeDismissDate
IS
BEGIN
    DECLARE
          v_id VARCHAR2(40);
          v_dateABC DATE;
          v_dateDismiss DATE;
        CURSOR cur IS
                select emp.EMP_NO, abc.date, emp.DISMISS_DATE  
                from  bazaabc.EmployeesDetails@BAZA_ABC abc,
                      employee_tab emp,
                      person_info_tab pin,
                      oracle_account oa
                where bhd.emp_no = emp.EMP_NO
                and   pin.PERSON_ID = emp.EMP_NO
                and   oa.USERNAME = pin.USER_ID
                and   emp.EMP_NO in (    
                select pi.PERSON_ID from tab_person pi
                where fu.active = 'TRUE'
                and   fu.IDENTITY = pi.USER_ID) 
                AND emp.EMP_NO like '%L%'
                and nvl(abc.date,to_date('20491231','yyyymmdd')) <>  
                nvl(emp.DISMISS_DATE,to_date('20491231','yyyymmdd'));

        BEGIN
                       OPEN cur;
                           LOOP
                  FETCH cur INTO v_id,v_dateABC,v_dateDismiss;    
                  DBMS_OUTPUT.PUT_LINE('v_id:  ' || v_id);
                  DBMS_OUTPUT.PUT_LINE('v_dateABC:  ' || v_dateABC);
                  DBMS_OUTPUT.PUT_LINE('v_dateDismiss:  ' ||v_dateDismiss );

                           EXIT WHEN cur%NOTFOUND;
                           END LOOP;
                       CLOSE cur;
        END;
EXCEPTION
    WHEN NO_DATA_FOUND
    THEN
        DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);

END;
/

【讨论】:

  • 我无法编译,也不知道我得到了什么。 PL/SQL: ORA-04052: ORA-00604 ORA-03106
  • 什么权限被授予执行 sql?对于 plsql,您需要显式授予权限。
  • OK 问题已解决!!我创建 VIEW 这个选择并在光标中使用 View
猜你喜欢
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多