SQLdeveloper 断开连接后,Oracle 是否会运行查询以完成?

Min*_*g K 4 oracle oracle-sql-developer network

查询是一个

CREATE TABLE t as SELECT .....; 
Run Code Online (Sandbox Code Playgroud)

陈述。断开连接后,我能否可靠地指望 Oracle 完成此操作?

重新连接后,如何查看此查询的状态?

Jos*_*ber 5

最有可能的是,它会在幕后完成一个 DDL 命令,但我不会把我的工作押在它上面。如果您的 CTAS 操作用完了表空间怎么办?你永远不会看到错误。如果您的 Internet 连接不可靠,那么最好的解决方案可能是

简单/基本的解决方案

  1. 使用 VNC 或 RDP“跳转”到位于数据中心的桌面或服务器。在该桌面操作系统上运行 SQL Developer 或任何客户端。如果您断开连接,只需重新连接 VNC 即可。您的数据库客户端永远不会中断与 Oracle 服务器的连接。

更酷的 Oracle 调度程序“nohup”解决方案。

但是如果你不能这样做,或者只是想用 Oracle 做一些更酷的事情,你可以在 Oracle 的调度程序作业中启动你的 DDL。如果您熟悉,这基本上就像在 Unix 中使用 NOHUP 一样。您调用DBMS_SCHEDULER.CREATE_JOB,然后作业从属进程将在以您的同一用户身份运行的 Oracle 服务器上继续完成工作。当您提交作业时,它将立即返回,除了“匿名块已完成”之外没有任何错误或确认,这仅意味着您已将异步作业排队。如果断开连接,则无所谓。您可以重新登录并通过USER_SCHEDULER_JOB_RUN_DETAILS内置视图检查作业状态。

我只是在 SQL Developer 中做到了这一点(注意,用户需要有CREATE JOB特权,显然CREATE TABLE也需要):

-- submit this as a background job
BEGIN
  dbms_scheduler.create_job ( 
      job_name => 'MY_BACKGROUND_JOB'
    , job_type => 'PLSQL_BLOCK'    
    , job_action => 'BEGIN EXECUTE IMMEDIATE ''CREATE TABLE t AS SELECT * FROM all_objects''; END;'
    , enabled => TRUE
    , auto_drop => TRUE
  );
END;
Run Code Online (Sandbox Code Playgroud)

...

-- Waited here a few seconds/minutes here for the job to complete.
Run Code Online (Sandbox Code Playgroud)

...

-- Couple of checks to make sure the table got created
SELECT created FROM user_objects WHERE object_name='T';

CREATED           
-------------------
06/09/2014 18:06:42 


SELECT count(*) FROM t;

  COUNT(*)
----------
     59907 
Run Code Online (Sandbox Code Playgroud)

这是状态检查。请注意状态检查显示成功和错误 0,所以一切都很好。

-- Check on last run of job with this name
SELECT * FROM
( SELECT job_name, status, error#, actual_start_date, log_date
  FROM user_scheduler_job_run_details
  WHERE job_name='MY_BACKGROUND_JOB'
  ORDER BY log_date DESC )
WHERE rownum=1;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我再次运行这项工作只是为了踢球,但我得到了一个 FAILED 错误 955 这是预期的,因为表t已经存在。