Min*_*g K 4 oracle oracle-sql-developer network
查询是一个
CREATE TABLE t as SELECT .....;
Run Code Online (Sandbox Code Playgroud)
陈述。断开连接后,我能否可靠地指望 Oracle 完成此操作?
重新连接后,如何查看此查询的状态?
最有可能的是,它会在幕后完成一个 DDL 命令,但我不会把我的工作押在它上面。如果您的 CTAS 操作用完了表空间怎么办?你永远不会看到错误。如果您的 Internet 连接不可靠,那么最好的解决方案可能是
简单/基本的解决方案
更酷的 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
已经存在。