GVKun编程网logo

sql – dba_jobs_running:尝试从过程访问时,表或视图不存在(过程已请求访问一对象)

16

在这篇文章中,我们将带领您了解sql–dba_jobs_running:尝试从过程访问时,表或视图不存在的全貌,包括过程已请求访问一对象的相关情况。同时,我们还将为您介绍有关"ORA-00942:表或

在这篇文章中,我们将带领您了解sql – dba_jobs_running:尝试从过程访问时,表或视图不存在的全貌,包括过程已请求访问一对象的相关情况。同时,我们还将为您介绍有关"ORA-00942: 表或视图不存在 "的原因和解决方法、"ORA-00942: 表或视图不存在" 的原因和解决方法、dba_job dba_schedule_jobs、dba_jobs_running:尝试从过程中访问时,表或视图不存在的知识,以帮助您更好地理解这个主题。

本文目录一览:

sql – dba_jobs_running:尝试从过程访问时,表或视图不存在(过程已请求访问一对象)

sql – dba_jobs_running:尝试从过程访问时,表或视图不存在(过程已请求访问一对象)

只需使用类似的东西查询正在运行的作业
select * from dba_jobs_running;

在我的sqldevelopers sql控制台中执行时工作正常.

但是,当在过程中具有完全相同的语句时,它不起作用.
编译失败

PL/sql: ORA-00942: table or view does not exist

有任何想法吗?是否有类似的范围需要考虑?

任何建议都非常感谢,提前谢谢:)

解决方法

您可能需要对拥有该过程的用户执行DBA_JOBS_RUNNING的直接GRANT.通过角色执行GRANT将无法工作……授权需要明确.

编辑:

从过程中执行SELECT需要从过程外部(例如在sql-Developer中)执行SELECT的略微不同的权限.拥有过程的用户必须已明确授予对表或视图的权限…如果从视图外部运行查询,则不是这种情况(例如,您可以通过角色授予权限)

您需要以SYS身份连接并转到:

GRANT SELECT ON SYS.DBA_JOBS_RUNNING TO <user-that-owns-proc>;

"ORA-00942: 表或视图不存在 "的原因和解决方法

错误原因:在Oracle新建了一个表,名为“QueryHistory",用来保存用户的查询记录,这时,再用"Select * from QueryHistory"来查询,报 "ORA-00942: 表或视图不存在 "

错误分析:利用Google搜索,找到了原因:

oracle是大小写敏感的,如果定义表名称或列名称的时候没有用引号引起来的话 oracle会把他们全部转换为大写,这时就会出现错误了.

解决方法:

将语句改为"Select * from "QueryHistory" 或是语句全部大写

"ORA-00942: 表或视图不存在" 的原因和解决方法

1、问题产生的原因

  Oracle 是大小写敏感的,我们创自己写Sql脚本创建表的时候Oracle会自动将我们的表名,字段名转成大写。

2、问题分析

      但是 Oracle 同样支持"" 语法,将表名或字段名加上""后,Oracle不会将其转换成大写

      如果加上了"",那么我们采用一般的SQL语句查询则会产生“ORA-00942: 表或视图不存在 ”,因此SQL脚本中需要将表名也加上""。例如:

select * from  "LDUser";

      这种情况在我们手写SQL的时候一般不会发生,但是我们使用powerdesigner设计数据库的时候,由于不注意会经常出现此类问题,因为Powerdesigner生成的SQL文件默认是加""的。

3、解决的办法

      因为我们使用的是Powerdesigner,所以可以不用手工改写SQL脚本,只要设置Powerdesigner重新生成即可。

  在PowerDesiger中,在physical data model 中找到菜单中的Database下的Edit current DBMS中,

  选择Script->Sql->Format,有一项CaseSensitivityUsingQuote,它的comment为“Determines if the case sensitivity for identifiers is managed using double quotes”,

  表示是否适用双引号来规定标识符的大小写,可以看到右边的values默认值为“YES”,改为“No”,点击【应用】按钮。

      这样再生成sql语句时,表和字段名上是没有引号了。

    



dba_job dba_schedule_jobs

dba_job dba_schedule_jobs

       DBMS_JOB和DBMS_SCHEDULER都是Oracle提供的程序包,都可以用来创建、管理job,其中DBMS_SCHEDULER的功能更为强大。先解释scheduler的基础概念,scheduler 包含了以下几个实体对象: 
Program -- 提供了scheduler 将要运行什么,包含program name,program type(PL/SQ块、存储过程、外部程序),program action(具体的程序实体,比如说一个PL/SQL块、或者是存储过程的名称、或者是外部程序的路径加名称) 。 
Schedules -- 指定何时何种频率来运行job,可以被不同的job重复的利用。比如说我有两个job都要求在每天的凌晨4点运行,那么两个job可以同时指定相同的schedule。 
Jobs -- 具体的作业的名称,依赖于那个program、schedule。也可以不指定program、schedule,而直接写入program、schedule的相应参数。
     另外,需要注意的是,通过DBMS_JOB和DBMS_SCHEDULER创建的job信息存储在不同的数据字典中,其中,通过DBMS_JOB创建的job信息存储在user_jobs,而通过DBMS_SCHEDULER创建的job信息存储在user_scheduler_jobs中。

下面,分别使用DBMS_JOB和DBMS_SCHEDULER来创建job。

使用DBMS_JOB
1.创建测试表

点击(此处)折叠或打开

SQL> create table hoegh(h1 date); 
 
Table created
 
SQL>
2.创建存储过程,向hoegh表中插入一条数据

点击(此处)折叠或打开

SQL> 
SQL> create or replace procedure pro_hoegh is
  2 begin
  3 insert into hoegh values(sysdate);
  4 COMMIT;
  5 end pro_hoegh;
  6 /
 
Procedure created
 
SQL>
3.创建job

点击(此处)折叠或打开

SQL> 
SQL> variable job1 number
SQL> begin
  2 dbms_job.submit(:job1,\''pro_hoegh;\'',sysdate,\''sysdate+1/1440\'');--每天1440分钟,即一分钟运行test过程一次
  3 end;
  4 /
 
PL/SQL procedure successfully completed
job1
---------
1
 
SQL>
4.执行job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 dbms_job.run(:job1);
  3 end;
  4 /
 
PL/SQL procedure successfully completed
job1
---------
1
 
SQL>
两分钟后,查询测试表,确认job是否正常执行

点击(此处)折叠或打开

SQL> select to_char(h1,\''yyyy-mm-dd HH24:mi:ss\'') H1 from hoegh;
 
H1
-------------------
2015-04-28 16:08:23
2015-04-28 16:07:21
 
SQL>

5.停止job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 dbms_job.broken(1,true);
  3 end;
  4 /
 
PL/SQL procedure successfully completed
 
SQL>
其中,1是创建job是定义的变量值,可以唯一标识一个job
6.启用job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 dbms_job.broken(1,false);
  3 end;
  4 /
 
PL/SQL procedure successfully completed
 
SQL>
7.删除job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 dbms_job.remove(1);
  3 end;
  4 /
 
PL/SQL procedure successfully completed
 
SQL>

使用DBMS_SCHEDULER
1.创建测试表

点击(此处)折叠或打开

SQL> create table hoegh(h1 date); 
 
Table created
 
SQL>
2.创建存储过程,向hoegh表中插入一条数据

点击(此处)折叠或打开

SQL> 
SQL> create or replace procedure pro_hoegh is
  2 begin
  3 insert into hoegh values(sysdate);
  4 COMMIT;
  5 end pro_hoegh;
  6 /
 
Procedure created
 
SQL>
3.创建schedule
在schedule中定义了schedule名称、起止时间、调用间隔等参数。
点击(此处)折叠或打开

SQL> 
SQL> begin
  2 -- create_schedule
  3 dbms_scheduler.create_schedule(schedule_name => \''schedule_hoegh\'',
  4 start_date => \''28-4月 -15 4.30.00.000 下午\'',
  5 repeat_interval => \''FREQ=MINUTELY; INTERVAL=1\'',
  6 end_date => \''29-4月 -15 4.30.00.000 下午\'',
  7 comments => \''TEST schedule\'');
  8 end;
  9 /
 
PL/SQL procedure successfully completed
 
SQL>
4.创建program
在program中定义了程序的类型、具体操作、参数个数等参数
点击(此处)折叠或打开

SQL> 
SQL> begin
  2 -- create_program
  3 dbms_scheduler.create_program(program_name => \''program_hoegh\'',
  4 program_type => \''PLSQL_BLOCK\'',
  5 program_action => \''BEGIN PRO_HOEGH; END;\'',
  6 number_of_arguments => 0,
  7 enabled => TRUE,
  8 comments => \''TEST program\'');
  9 end;
 10 /
 
PL/SQL procedure successfully completed
 
SQL>

5.创建job
在job中指定了job_name,以及相关联的program_name、schedule_name等参数。
点击(此处)折叠或打开

SQL> 
SQL> begin
  2 -- create_job
  3 dbms_scheduler.create_job(job_name => \''job_hoegh\'',
  4 program_name => \''program_hoegh\'',
  5 schedule_name => \''schedule_hoegh\'',
  6 job_class => \''DEFAULT_JOB_CLASS\'',
  7 enabled => true,
  8 auto_drop => true,
  9 comments => \''TEST procedure\'');
 10 end;
 11 /
 
PL/SQL procedure successfully completed
 
SQL>
6.执行job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 -- Call the procedure
  3 dbms_scheduler.run_job(job_name => \''job_hoegh\'',
  4 use_current_session => false);
  5 end;
  6 /
 
PL/SQL procedure successfully completed
 
SQL>
几分钟后,查询测试表,确认job是否正常执行

点击(此处)折叠或打开

SQL> select to_char(h1,\''yyyy-mm-dd HH24:mi:ss\'') H1 from hoegh;
 
H1
-------------------
2015-04-28 16:30:00
2015-04-28 16:31:00
2015-04-28 16:32:00
2015-04-28 16:24:25
 
SQL>
7.禁用job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 dbms_scheduler.disable(\''job_hoegh\'');
  3 end;
  4 /
 
PL/SQL procedure successfully completed
 
SQL> 
SQL> select job_name,enabled,state from user_scheduler_jobs;
 
JOB_NAME ENABLED STATE
------------------------------ ------- ---------------
JOB_HOEGH FALSE DISABLED
 
SQL>
8.启用job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 dbms_scheduler.enable(\''job_hoegh\'');
  3 end;
  4 /
 
PL/SQL procedure successfully completed
 
SQL> 
SQL> select job_name,enabled,state from user_scheduler_jobs;
 
JOB_NAME ENABLED STATE
------------------------------ ------- ---------------
JOB_HOEGH TRUE SCHEDULED
 
SQL>
9.删除job

点击(此处)折叠或打开

SQL> 
SQL> begin
  2 dbms_scheduler.drop_job(\''job_hoegh\'');
  3 end;
  4 /
 
PL/SQL procedure successfully completed
 
SQL> 
SQL> select job_name,enabled,state from user_scheduler_jobs;
 
JOB_NAME ENABLED STATE
------------------------------ ------- ---------------
 
SQL>

 

       DBMS_JOB和DBMS_SCHEDULER都是Oracle提供的程序包,都可以用来创建、管理job,其中DBMS_SCHEDULER的功能更为强大。先解释scheduler的基础概念,scheduler 包含了以下几个实体对象: 

 

  1. Program -- 提供了scheduler 将要运行什么,包含program name,program type(PL/SQ块、存储过程、外部程序),program action(具体的程序实体,比如说一个PL/SQL块、或者是存储过程的名称、或者是外部程序的路径加名称) 。 
  2. Schedules -- 指定何时何种频率来运行job,可以被不同的job重复的利用。比如说我有两个job都要求在每天的凌晨4点运行,那么两个job可以同时指定相同的schedule。 
  3. Jobs -- 具体的作业的名称,依赖于那个program、schedule。也可以不指定program、schedule,而直接写入program、schedule的相应参数。

 

     另外,需要注意的是,通过DBMS_JOB和DBMS_SCHEDULER创建的job信息存储在不同的数据字典中,其中,通过DBMS_JOB创建的job信息存储在user_jobs,而通过DBMS_SCHEDULER创建的job信息存储在user_scheduler_jobs中

下面,分别使用DBMS_JOB和DBMS_SCHEDULER来创建job。

使用DBMS_JOB
1.创建测试表

点击(此处)折叠或打开

  1. SQL> create table hoegh(h1 date); 
  2.  
  3. Table created
  4.  
  5. SQL>

2.创建存储过程,向hoegh表中插入一条数据

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> create or replace procedure pro_hoegh is
  3.   2 begin
  4.   3 insert into hoegh values(sysdate);
  5.   4 COMMIT;
  6.   5 end pro_hoegh;
  7.   6 /
  8.  
  9. Procedure created
  10.  
  11. SQL>

3.创建job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> variable job1 number
  3. SQL> begin
  4.   2 dbms_job.submit(:job1,\''pro_hoegh;\'',sysdate,\''sysdate+1/1440\'');--每天1440分钟,即一分钟运行test过程一次
  5.   3 end;
  6.   4 /
  7.  
  8. PL/SQL procedure successfully completed
  9. job1
  10. ---------
  11. 1
  12.  
  13. SQL>

4.执行job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 dbms_job.run(:job1);
  4.   3 end;
  5.   4 /
  6.  
  7. PL/SQL procedure successfully completed
  8. job1
  9. ---------
  10. 1
  11.  
  12. SQL>

两分钟后,查询测试表,确认job是否正常执行

点击(此处)折叠或打开

  1. SQL> select to_char(h1,\''yyyy-mm-dd HH24:mi:ss\'') H1 from hoegh;
  2.  
  3. H1
  4. -------------------
  5. 2015-04-28 16:08:23
  6. 2015-04-28 16:07:21
  7.  
  8. SQL>


5.停止job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 dbms_job.broken(1,true);
  4.   3 end;
  5.   4 /
  6.  
  7. PL/SQL procedure successfully completed
  8.  
  9. SQL>

其中,1是创建job是定义的变量值,可以唯一标识一个job
6.启用job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 dbms_job.broken(1,false);
  4.   3 end;
  5.   4 /
  6.  
  7. PL/SQL procedure successfully completed
  8.  
  9. SQL>

7.删除job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 dbms_job.remove(1);
  4.   3 end;
  5.   4 /
  6.  
  7. PL/SQL procedure successfully completed
  8.  
  9. SQL>


使用DBMS_SCHEDULER
1.创建测试表

点击(此处)折叠或打开

  1. SQL> create table hoegh(h1 date); 
  2.  
  3. Table created
  4.  
  5. SQL>

2.创建存储过程,向hoegh表中插入一条数据

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> create or replace procedure pro_hoegh is
  3.   2 begin
  4.   3 insert into hoegh values(sysdate);
  5.   4 COMMIT;
  6.   5 end pro_hoegh;
  7.   6 /
  8.  
  9. Procedure created
  10.  
  11. SQL>

3.创建schedule
schedule中定义了schedule名称、起止时间、调用间隔等参数。

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 -- create_schedule
  4.   3 dbms_scheduler.create_schedule(schedule_name => \''schedule_hoegh\'',
  5.   4 start_date => \''28-4月 -15 4.30.00.000 下午\'',
  6.   5 repeat_interval => \''FREQ=MINUTELY; INTERVAL=1\'',
  7.   6 end_date => \''29-4月 -15 4.30.00.000 下午\'',
  8.   7 comments => \''TEST schedule\'');
  9.   8 end;
  10.   9 /
  11.  
  12. PL/SQL procedure successfully completed
  13.  
  14. SQL>

4.创建program
在program中定义了程序的类型、具体操作、参数个数等参数

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 -- create_program
  4.   3 dbms_scheduler.create_program(program_name => \''program_hoegh\'',
  5.   4 program_type => \''PLSQL_BLOCK\'',
  6.   5 program_action => \''BEGIN PRO_HOEGH; END;\'',
  7.   6 number_of_arguments => 0,
  8.   7 enabled => TRUE,
  9.   8 comments => \''TEST program\'');
  10.   9 end;
  11.  10 /
  12.  
  13. PL/SQL procedure successfully completed
  14.  
  15. SQL>


5.创建job
在job中指定了job_name,以及相关联的program_name、schedule_name等参数。

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 -- create_job
  4.   3 dbms_scheduler.create_job(job_name => \''job_hoegh\'',
  5.   4 program_name => \''program_hoegh\'',
  6.   5 schedule_name => \''schedule_hoegh\'',
  7.   6 job_class => \''DEFAULT_JOB_CLASS\'',
  8.   7 enabled => true,
  9.   8 auto_drop => true,
  10.   9 comments => \''TEST procedure\'');
  11.  10 end;
  12.  11 /
  13.  
  14. PL/SQL procedure successfully completed
  15.  
  16. SQL>

6.执行job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 -- Call the procedure
  4.   3 dbms_scheduler.run_job(job_name => \''job_hoegh\'',
  5.   4 use_current_session => false);
  6.   5 end;
  7.   6 /
  8.  
  9. PL/SQL procedure successfully completed
  10.  
  11. SQL>

几分钟后,查询测试表,确认job是否正常执行

点击(此处)折叠或打开

  1. SQL> select to_char(h1,\''yyyy-mm-dd HH24:mi:ss\'') H1 from hoegh;
  2.  
  3. H1
  4. -------------------
  5. 2015-04-28 16:30:00
  6. 2015-04-28 16:31:00
  7. 2015-04-28 16:32:00
  8. 2015-04-28 16:24:25
  9.  
  10. SQL>

7.禁用job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 dbms_scheduler.disable(\''job_hoegh\'');
  4.   3 end;
  5.   4 /
  6.  
  7. PL/SQL procedure successfully completed
  8.  
  9. SQL> 
  10. SQL> select job_name,enabled,state from user_scheduler_jobs;
  11.  
  12. JOB_NAME ENABLED STATE
  13. ------------------------------ ------- ---------------
  14. JOB_HOEGH FALSE DISABLED
  15.  
  16. SQL>

8.启用job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 dbms_scheduler.enable(\''job_hoegh\'');
  4.   3 end;
  5.   4 /
  6.  
  7. PL/SQL procedure successfully completed
  8.  
  9. SQL> 
  10. SQL> select job_name,enabled,state from user_scheduler_jobs;
  11.  
  12. JOB_NAME ENABLED STATE
  13. ------------------------------ ------- ---------------
  14. JOB_HOEGH TRUE SCHEDULED
  15.  
  16. SQL>

9.删除job

点击(此处)折叠或打开

  1. SQL> 
  2. SQL> begin
  3.   2 dbms_scheduler.drop_job(\''job_hoegh\'');
  4.   3 end;
  5.   4 /
  6.  
  7. PL/SQL procedure successfully completed
  8.  
  9. SQL> 
  10. SQL> select job_name,enabled,state from user_scheduler_jobs;
  11.  
  12. JOB_NAME ENABLED STATE
  13. ------------------------------ ------- ---------------
  14.  
  15. SQL>

dba_jobs_running:尝试从过程中访问时,表或视图不存在

dba_jobs_running:尝试从过程中访问时,表或视图不存在

只需使用类似的内容查询正在运行的作业

select * from dba_jobs_running;

在我的sqldevelopers SQL控制台中执行时,效果很好。

但是,在过程中具有完全相同的语句时,它不起作用。编译失败

PL/SQL: ORA-00942: table or view does not exist

有任何想法吗?是否有需要考虑的范围?

任何建议都将受到高度赞赏,在此先感谢:)

今天关于sql – dba_jobs_running:尝试从过程访问时,表或视图不存在过程已请求访问一对象的分享就到这里,希望大家有所收获,若想了解更多关于"ORA-00942: 表或视图不存在 "的原因和解决方法、"ORA-00942: 表或视图不存在" 的原因和解决方法、dba_job dba_schedule_jobs、dba_jobs_running:尝试从过程中访问时,表或视图不存在等相关知识,可以在本站进行查询。

本文标签: