表或视图不存在

Posted

技术标签:

【中文标题】表或视图不存在【英文标题】:Table or view doesnot exist 【发布时间】:2014-02-28 13:04:24 【问题描述】:

您好,下面是我的代码。我需要创建一个视图并使用视图中的数据在另一个游标中获取数据。但是当我执行我的代码时,我得到了错误

“ORA-06550:第 56 行,第 37 列: PL/SQL: ORA-00942: ORA-06550:第 52 行,第 9 列: PL/SQL: SQL 语句被忽略"

这里有什么问题? 提前致谢。

declare

drop_view_sql varchar2(100) := 'drop view rv_task_number_view';

type tasks_rec is record(task_number varchar2(20));

type t_tab is table of  tasks_rec;

tasks_tab t_tab;

notes_rec xx_fs_mob_loc_rec.task_notes_rec;

notes_tab xx_fs_mob_loc_rec.task_notes_tab;

    begin

        execute immediate 'create view apps.rv_task_number_view  as
                          SELECT distinct ct.task_number                  
                          FROM csf_ct_tasks ct ,

                            cs_estimate_details ced,
                            csf_debrief_headers cdh,
                            csf_debrief_lines   cdl,
                            jtf_task_assignments jta  

                   WHERE    1=1
                   and      jta.task_id = ct.task_id
                   and      jta.task_assignment_id = cdh.task_assignment_id(+)
                   and      cdh.debrief_header_id = cdl.debrief_header_id(+)
                   and      cdl.debrief_line_id = ced.source_id(+)
                   AND      ((ct.planned_end_date between (sysdate-30) and (sysdate+30)) or (ct.scheduled_end_date between (sysdate-30) and (sysdate+30)))
                   and      jta.resource_id = 10153';

              execute immediate     'grant select on apps.rv_task_number_view to apps';

        DBMS_OUTPUT.PUT_LINE(sqlerrm);

        declare

        CURSOR c2 is

        SELECT ct.task_id,jtf_note_id,  jnv.notes,
               jnv.creation_date,jnv.last_update_date
            FROM
               jtf_notes_vl jnv,
               csf_ct_tasks ct,apps.rv_task_number_view rvt
            WHERE
                jnv.source_object_code = 'TASK' 
                and ct.task_number = jnv.source_number
                and ct.task_number = rvt.task_number
                order by task_id, jtf_note_id;

        begin

        open c2;

        fetch c2 bulk collect into notes_tab;

        DBMS_OUTPUT.PUT_LINE(sqlerrm);

        end;

        execute immediate drop_view_sql;

        DBMS_OUTPUT.PUT_LINE(sqlerrm);

    END;

【问题讨论】:

在SQL中直接输入命令是否有效? 【参考方案1】:

您正在尝试访问使用 动态 SQL 在您 SELECT 它所在的同一块中创建的 TABLE/VIEW(静态 SQL

每个PL/SQL 块将在执行之前编译。 虽然编译 rv_task_number_view 不可用!

所以,SELECT 也需要是动态的!

  C2 SYS_REFCURSOR;

   OPEN C2 FOR 

    'SELECT ct.task_id,jtf_note_id,  jnv.notes,
           jnv.creation_date,jnv.last_update_date
        FROM
           jtf_notes_vl jnv,
           csf_ct_tasks ct,apps.rv_task_number_view rvt
        WHERE
            jnv.source_object_code = ''TASK'' 
            and ct.task_number = jnv.source_number
            and ct.task_number = rvt.task_number
            order by task_id, jtf_note_id';

【讨论】:

以上是关于表或视图不存在的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00942: 表或视图不存在,即使它存在

表或视图不存在

Oracle ORA-00942:表或视图存在时不存在 [重复]

ORA-00942: 表或视图不存在解决方法

SQL 错误:ORA-00942 表或视图不存在

ORA-00942: 使用 iBatis 的表或视图不存在