当前位置:文档之家› Oracle定时执行计划任务.

Oracle定时执行计划任务.

Oracle定时执行计划任务.
Oracle定时执行计划任务.

Oracle 定时执行计划任务

Oracle 在 10g 版本以前, 计划任务用的是 DBMS_JOB包, 10g 版本引入

DBMS_SCHEDULER来替代先前的 DBMS_JOB,在功能方面 , 它比 DBMS_JOB提供了更强大的功能和更灵活的机制管理, 但 DBMS_JOB包的使用相对比较简单, 也基本能够满足定时执行计划任务的需求, 故接下来就先看看 DBMS_JOB包的使用方法。

1. DBMS_JOB

我们可以在命令窗口输入 show parameter job_queue_processes查看数据库中定时任务的最多并发数,一般设置为 10(设置方法:alter system set

job_queue_processes=10 ,如果设为 0,那么数据库定时作业是不会运行的。

oracle 定时执行 job queue 的后台进程是 SNP , 要启动 snp, 首先看系统模式是否支持 sql> alter system enable restricted session;或 sql> alter system disenable restricted session; 利用上面的命令更改系统的会话方式为 disenable restricted,为 snp 的启动创建条件 .

接下来我们尝试实现以下功能:每隔一分钟自动向 job_test表中插入当前的系统时间。 1、创测试表

create table job_test(updatetime date;

2、创建 JOB

variable v_job_no number;

begin

dbms_job.submit(:v_job_no, 'insert into job_test values(sysdate;', sysdate,

'sysdate+1/1440';

end;

/

其中最后一个参数 'sysdate+1/1440'表示时间间隔为每分钟。其它常用的时间间隔的设置如下:

(1如果想每天凌晨 1点执行,则此参数可设置为 'trunc(sysdate+25/24';

(2如果想每周一凌晨 1点执行,则此参数可设置为

'trunc(next_day(sysdate,1+25/24';

(3如果想每月 1号凌晨 1点执行,则此参数可设置为

'trunc(last_day(sysdate+25/24';

(4如果想每季度执行一次,则此参数可设置为

'trunc(add_months(sysdate,3,'Q'+1/24';

(5如果想每半年执行一次,则此参数可设置为

'add_months(trunc(sysdate,'yyyy',6+1/24';

(6如果想每年执行一次,则此参数可设置为

'add_months(trunc(sysdate,'yyyy',12+1/24'。

select * from user_jobs;--查看当前用户的调度任务

select * from dba_jobs_running;--查看正在执行的调度任务select * from dba_jobs;--查看执行完的调度任务

select * from all_jobs; -- 查看数据库系统所有任务

实例 1:

1. 创建测试表

create table a(a date;

2. 创建一个存储过程

create or replace procedure test as

begin

insert into a values(sysdate;

end;

/

3. 创建 JOB (任务计划

variable job1 number;

begin

dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440'; end;

/

--每天 1440分钟,即一分钟运行 test 存储过程一次

4. 运行 JOB

begin

dbms_job.run(:job1;

end;

/

5. 查看执行结果

select to_char(a,'yyyy/mm/dd hh24:mi:ss' 时间 from a; 6. 删除 JOB begin

dbms_job.remove(:job1;

end;

/

job 的使用说明:

DBMS_JOB.SUBMIT(:jobno,//job号

'your_procedure;',//要执行的过程

trunc(sysdate+1/24,//下次执行时间

'trunc(sysdate+1/24+1'//每次间隔时间

;

删除 job:dbms_job.remove(jobno;

修改要执行的操作 :job:dbms_job.what(jobno,what; 修改下次执行时间:dbms_job.next_date(job,next_date; 修改间隔时间:dbms_job.interval(job,interval;

停止 job:dbms.broken(job,broken,nextdate;

启动 job:dbms_job.run(jobno;

例子:

VARIABLE jobno number;

begin

DBMS_JOB.SUBMIT(:jobno,

'Procdemo;',//Procdemo为过程名称

SYSDATE, 'SYSDATE + 1/720';

commit;

end;

/

2. DBMS_SCHEDULER

DBMS_SCHEDULER的功能更强大,定义更灵活,增强了与系统的交互性。可以有两种方式来定义 " 计划 " :

1 使用 DBMS_SCHDULER.CREATE_SCHEDULE //定义一个计划,计划再调用job;

2 调用 DBMS_SCHDULER.CREATE_JOB //过程直接定义 job

例子 1:用 DBMS_SCHDULER.CREATE_JOBE直接创建 job

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => 'update_bb', //job的名字

job_type => 'STORED_PROCEDURE', //job的类型为“执行存储过程” job_action => 'OPS.SALES_PKG.UPDATE_SALES_SUMMARY', //存储过程的名字

start_date => '28-APR-10 07.00.00 PM Australia/Sydney', //这里把时区去掉也可以!

repeat_interval => 'FREQ=DAILY;INTERVAL=2', /* every other day */

enabled =>true, //启动该 job

comments => 'My new job'; //注释

END;

/

参数说明:

·job_name: 顾名思义 , 每个 job 都必须有一个的名称

·schedule_name: 如果定义了计划,在这里指定计划的名称

·job_type: 目前支持三种类型 :

·PLSQL_BLOCK : PL/SQL块 : 需要输入完整的 PL/SQL代码 ;

·STORED_PROCEDURE : 存储过程 : 需要指定存储过程的名字 ;

·EXECUTABLE: 外部程序 : (外部程序可以是一个 shell 脚本 , 也可以是操作系统级别的指令 . 需要输入 script 的名称或者操作系统的指令名

·enabled: 上面已经说过了,指定 job 创建完毕是否自动激活

·comments: 对于 job 的简单说明

例子 2:

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => 'zbb_job3',

job_type => 'PLSQL_BLOCK', //job的类型是执行 sql 语句 job_action => 'insert into bb values(1,sysdate;',

start_date => sysdate,

repeat_interval => 'freq = minutely; interval=1', //每分钟执行一次

enabled => true,

comments => 'my love';

END;

/

注意: enabled 默认为 false , oracle 不会运行此 job ,所有我们需要 enable 它SQL> exec dbms_scheduler.enable ('zbb_job3';

例子 3:使用 DBMS_SCHDULER.CREATE_SCHEDULE

建立 scheduler(控制时间和频率,然后给它添加几个 jobs (动作!

BEGIN

DBMS_SCHEDULER.CREATE_SCHEDULE ( //创建计划任务

schedule_name => 'zbb_schedule',

repeat_interval => 'FREQ=MINUTELY; INTERVAL=5', //执行间隔:每 5分钟comments => 'Every 5 MINUTS';

END;

/

接下来往“ zbb_schedule”里添加一个job “ zbb_job2”:

BEGIN

DBMS_SCHEDULER.CREATE_JOB ( //创建 job 并把它加入到 scheduler 里面job_name => 'zbb_job2',

job_type => 'PLSQL_BLOCK',

job_action => 'insert into bb values(1,sysdate;',

schedule_name => 'ZBB_SCHEDULE';

END;

/

再往“ zbb_schedule”里添加一个job “ zbb_job3”:

BEGIN

DBMS_SCHEDULER.CREATE_JOB (

job_name => 'zbb_job3',

job_type => 'PLSQL_BLOCK',

job_action => 'insert into bb values(1,sysdate;',

schedule_name => 'ZBB_SCHEDULE';

END;

/

运行“ select job_name,schedule_name from user_scheduler_jobs;”可以查看到所有的 job 。

也可以将“ zbb_job1” 加入到“ zbb_schedule”

SQL> begin

2 dbms_scheduler.SET_ATTRIBUTE( //注意这里执行的是修改属性的过程

3 name => 'zbb_job1',

4 attribute => 'schedule_name',

5 value => 'ZBB_SCHEDULE';

6 end;

7 /

删除 job 及 scheduler:

SQL> BEGIN

DBMS_SCHEDULER.DROP_JOB ( //删除 job ;多个 job 间用逗号隔开

job_name => 'zbb_job2,zbb_job3',

force => TRUE;

END;

/

如何删除 scheduler :

BEGIN

DBMS_SCHEDULER.DROP_SCHEDULE ( schedule_name => 'zbb_schedule', force END; / 如何修改 job 的属性(frequency:频率): BEGIN

DBMS_SCHEDULER.SET_ATTRIBUTE ( name attribute value END; / => => =>

'zbb_job1', 'repeat_interval', 'FREQ=DAILY'; //每天执行一次 => true ; // 设为 true 强制;false。 jobs 创建时为“disabled”状态。我们必须手动“enable”它: BEGIN DBMS_SCHEDULER.ENABLE ('job1, job2, job3, sys.jobclass1, sys.jobclass2,

sys.jobclass3'; /* sys.jobclass1 下的所有 jobs 都会被 enable */END;/ END; / 查看 job 的状态: SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS WHERE JOB_NAME = 'MY_EMP_JOB1'; 查看 Job Logs: SELECT JOB_NAME, OPERATION, OWNER FROM DBA_SCHEDULER_JOB_LOG; 查看 Job 运行的详细情况: select log_id, job_name, status, to_char(log_date, 'DD-MON-YYYY HH24:MI' log_date from dba_scheduler_job_run_detailswhere job_name = 'MY_JOB14'; 如何管理计划任务的权限: GRANT SCHEDULER_ADMIN TO username;GRANT CREATE JOB TO scott; GRANT ALTER myjob1 TO scott;GRANT MANAGE SCHEDULER TO adam; PLSQL 举例如下: begin dbms_scheduler.create_job ( job_name => '测试', job_type => 'PLSQL_BLOCK', job_action => 'insert into job_test values(sysdate;',

start_date => sysdate, end_date => add_months(sysdate,12000, repeat_interval =>

'FREQ=MINUTELY; INTERVAL=1', enabled => true,

comments => '定时执行计划任务' ; end; 以上代码可以通过在 PLSQL Developer 中新建 Jobs 轻松设定:参数含义如下:?JOB_NAME :指定任务的名称,必选值,注意要确保指定的名称唯一。?JOB_TYPE :任务执行的操作类型,必选值,有下列几个可选值:?PLSQL_BLOCK :表示任务执行的是一个 PL/SQL 匿名块。?STORED_PROCEDURE :表示任务执行的是 ORACLE 过程(含 PL/SQL PROCEDURE 和 JAVA PROCEDURE。?EXECUTABLE :表示任务执行的是一个外部程序,比如说操作系统命令。?CHAIN :表示任务执行的是一个 CHAIN。?JOB_ACTION :任务执行的操作,必选值,应与 JOB_TYPE 类型中指定的参数相

匹配。比如说对于 PL/SQL 匿名块,此处就可以放置 PL/SQL 块的具体代表,类似DECLARE .. BEGIN ..END 这类;如果是 ORACLE 过程,那么此处应该指定具体的过程名,注意由于任务执行,即使过程中有 OUT 之类参数,实际执行时也不会有输出的。

?START_DATE :指定任务初次执行的时间,本参数可为空,当为空时,表示任务立刻执行,效果等同于指定该参数值为 SYSDATE。

?REPEAT_INTERVAL :指定任务执行的频率,比如多长时间会被触发再次执行。本参数也可以为空,如果为空的话,就表示当前设定的任务只执行一次。REPEAT_INTERVAL 参数需要好好说说,REPEAT_INTERVAL 参数的语法结构要复杂的多。其中最重要的是 FREQ 和 INTERVAL 两个关键字。?FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY,分别表示年、月、周、日、时、分、秒等单位。?INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从 1-99。例如:REPEAT_INTERVAL=>'FREQ=DAILY;INTERVAL=1';表示每天执行一次,如果将 INTERVAL 改为 7 就表示每 7 天执行一次,效果等同于

FREQ=WEEKLY;INTERVAL=1。一般来说,使用

DBMS_SCHEDULER.CREATE_JOB 创建一个 JOB,至少需要指定上述参数中的前 3 项。除此之外,还可以在 CREATE_JOB 时,指定下列参数:

?NUMBER_OF_ARGUMENTS :指定该 JOB 执行时需要附带的参数的数量,默认值为 0,注意当 JOB_TYPE 列值为 PLSQL_BLOCK 或 CHAIN 时,本参数必须设置为 0,因为上述两种情况下不支持附带参数。?END_DATE :指定任务的过期时间,默认值为 NULL。任务过期后,任务的 STATE 将自动被修改为COMPLETED,ENABLED 被置为 FALSE。如果该参数设置为空的话,表示该任务永不过期,将一直按照 REPEAT_INTERVAL 参数设置的周期重复执行,直到达到设置的 MAX_RUNS 或 MAX_FAILURES 值。?JOB_CLASS :指定任务关联的 CLASS,默认值为 DEFAULT_JOB_CLASS。?ENABLED :指定任务是否启用,默认值为 FALSE。FALSE 状态表示该任务并不会被执行,除非被用户手动调用,或者用户将该任务的状态修改为 TRUE。?AUTO_DROP :当该标志被置为

TRUE 时,ORACLE 会在满足条件时自动删除创建的任务?任务已过期;?任务最大运行次数已达 MAX_RUNS 的设置值;?任务未指定 REPEAT_INTERVAL 参数,仅运行一次;?COMMENTS :设置任务的注释信息,默认值为 NULL。日历表达式:MON 表示星期一,SUN 表示星期天,DAY 表示每天,WEEK 表示每周等等. 下面来看几个使用日历表达式的例子: repeat_interval => 'FREQ=HOURLY; INTERVAL=2' 每隔 2 小时运行一次 job repeat_interval => 'FREQ=DAILY; BYHOUR=4,5,6' 每天 4,5,6 运行一次 job, repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI" 每周的 1,3,5 运行 job repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30' 每年的 3,6,9,12 月的 30 号运行 job repeat_interval =>

‘freq=daily;byhour=8,13,18;byminute=0;bysecond=0;bydate=0502,0922’ jobs 将会在

05/02 and 09/22 are 8:00 a.m., 1:00 p.m., and 6:00 p.m. 运行。

ORACLE 执行计划介绍与测试

ORACLE 执行计划介绍与测试 (沈克勤) 2005-3-3

1.目的: 本文档的目的是通过介绍常用的HINT来了解ORACLE的优化器的工作原理及执行计划,以期望起到抛砖引玉的作用。在实际开发中有意识地控制SQL的执行计划,以达到SQL 执行性能的最优以及执行计划稳定。 为了减少枯燥的文档描述,使用了较多的图示。 2.如何查看执行计划 首先创建EXPLAIN_PLAN表 不同版本的ORACLE,该表结构可能会不同。请使用的ORACLE中 $ORACLE_HOME/rdbms/admin/utlxplan.sql去创建该表。 方法1:使用SQL*PLUS 的SET AUTOTRACE : SQL>SET AUTOTRACE ON EXPLAIN 执行SQL,且仅显示执行计划 SQL>SET AUTOTRACE ON STATISTICS 执行SQL,且仅显示执行统计信息 SQL>SET AUTOTRACE ON 执行SQL,且显示执行计划与执行统计信息SQL>SET AUTOTRACE TRACEONLY 仅显示执行计划与统计信息,无执行结果SQL>SET AUTOTRACE OFF 关闭跟踪显示计划与统计

方法2:使用PL/SQL Developer工具

方法3:使用DBMS_XPLAN.DISPLAY() 方法4:直接查看表:EXPLAIN_TABLE SELECT lpad(' ',level-1)||operation||' '||options||' '|| object_name "Plan" FROM plan_table CONNECT BY prior id = parent_id AND prior statement_id = statement_id START WITH id = 0AND statement_id = '&1' ORDER BY id; 3.如何控制与改变执行计划 我并没有见过单独介绍ORACLE SQL优化器原理方面的资料。但可以从ORACLE的HINT这个侧面来了解ORACLE的优化器的原理,从而最有效地书写SQL。

PLSQL DEVELOPER ORACLE创建定时调度job

PL/SQL DEVELOPER ORACLE创建定时调度job Oracle 创建oracle调度job 右键“new”弹出 Submitter这里不用修改 Job这里不用填 What: pw_sbtz_gisdata_procedure; 请注意后面的“;”,一定不能少 Next date:sysdate Interval: TRUNC(next_day(sysdate,'星期一'))+1/24 后面的不用填写,只需要填写上面三个,填写完成后点击“Apply”就可以了 1、代表每个星期一凌晨一点 TRUNC(next_day(sysdate,'星期一'))+1/24 2、每天午夜12点 ''TRUNC(SYSDATE + 1)'' 3、每天早上8点30分 ''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)'' 4、每星期二中午12点 ''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24'' 5、每个月第一天的午夜12点 ''TRUNC(LAST_DAY(SYSDATE ) + 1)'' 6、每个季度最后一天的晚上11点 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24'' 7、每星期六和日早上6点10分 ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)8、每分钟执行 Interval => TRUNC(sysdate,'mi') + 1/ (24*60) 或 Interval => sysdate+1/1440 9、每天定时执行 例如:每天的凌晨1点执行 Interval => TRUNC(sysdate) + 1 +1/ (24)

利用Oracle执行计划机制提高查询性能

利用Oracle执行计划机制提高查询性能消耗在准备利用Oracle执行计划机制提高查询性能新的SQL语句的时间是Oracle SQL语句执行时间的最重要的组成部分。但是通过理解Oracle内部产生执行计划的机制,你能够控制Oracle花费在评估连接顺序的时间数量,并且能在大体上提高查询性能。 准备执行SQL语句 当SQL语句进入Oracle的库缓存后,在该语句准备执行之前,将执行下列步骤: 1) 语法检查:检查SQL语句拼写是否正确和词序。 2) 语义分析:核实所有的与数据字典不一致的表和列的名字。 3) 轮廓存储检查:检查数据字典,以确定该SQL语句的轮廓是否已经存在。 4) 生成执行计划:使用基于成本的优化规则和数据字典中的统计表来决定最佳执行计划。 5) 建立二进制代码:基于执行计划,Oracle生成二进制执行代码。 一旦为执行准备好了SQL语句,以后的执行将很快发生,因为Oracle认可同一个SQL语句,并且重用那些语句的执行。然而,对于生成特殊的SQL语句,或嵌入了文字变量的SQL语句的系统,SQL执行计划的生成时间就很重要了,并

且前一个执行计划通常不能够被重用。对那些连接了很多表的查询,Oracle需要花费大量的时间来检测连接这些表的适当顺序。 评估表的连接顺序 在SQL语句的准备过程中,花费最多的步骤是生成执行计划,特别是处理有多个表连接的查询。当Oracle评估表的连接顺序时,它必须考虑到表之间所有可能的连接。例如:六个表的之间连接有720(6的阶乘,或6 * 5 * 4 * 3 * 2 * 1 = 720)种可能的连接线路。当一个查询中含有超过10个表的连接时,排列的问题将变得更为显著。对于15个表之间的连接,需要评估的可能查询排列将超过1万亿(准确的数字是1,307,674,368,000)种。 使用optimizer_search_limit参数来设定限制 通过使用optimizer_search_limit参数,你能够指定被优化器用来评估的最大的连接组合数量。使用这个参数,我们将能够防止优化器消耗不定数量的时间来评估所有可能的连接组合。如果在查询中表的数目小于optimizer_search_limit的值,优化器将检查所有可能的连接组合。 例如:有五个表连接的查询将有120(5! = 5 * 4 * 3 * 2 * 1 = 120)种可能的连接组合,因此如果optimizer_search_limit等于5(默认值),则优化器将评

Oracle数据库定时自动备份批处理代码

echo off set pweek=%date:~-1% set fn=e:\bakdb\gdosys_dqgis%Date:~0,4%%Date:~5,2%%Date:~8,2% if %pweek% equ 日 ( exp system/sysorcl file=%fn%.dmp owner=gdosys,dqgis log=%fn%.log rar a %fn%.rar %fn%.* del %fn%.dmp del %fn%.log ) else ( exp system/sysorcl file=d:\bakweek\%date:~8,2%.dmp owner=gdosys,dqgis log=d:\bakweek\%date:~8,2%.log rem exp system/sysorcl file=d:\bakweek\%date:~11,3%.dmp owner=gdosys log=d:\bakweek\%date:~11,3%.log ) ———————————————————————————————————————————— hi.baidu./lvns/blog/item/beb171d3c2fa2cd6a8ec9a2d.html 这是最近写的一个Oracle数据库自动备份的批处理,经过测试正常运行,记录如下。包括两部分,逻辑备份和冷备份,如有不完整之处,还往看到本文的高手指导! 注:这些容是本人经过一番学习和多次测试调试后的结果,如果想,请以连接的形式,合作!第一部分,逻辑备份 下面是:AutoBackup_Logic.bat --逻辑备份的主文件,直接在计划任务中调用就可以了。echo off rem rem 需要配置的参数说明: rem BAT_HOME:即本批处理所在的目录; rem DUMP_DIR:即要备份到的数据文件目录,存在与数据字典表:dba_directories 中。rem set BAT_HOME=E:\BAT set DUMP_DIR=E:\Temp\DBBackup set BKFILE=%Date:~0,4%%Date:~5,2%%Date:~8,2% set HHMMSS=%time:~0,2%%time:~3,2%%time:~6,2% call %BAT_HOME%\LogicBackup.bat %DUMP_DIR% >%BAT_HOME%\LogicBackup_%BKFILE%%HHM MSS%.log echo Completed! 下面是:LogicBackup.bat echo off rem call LogicBackup.bat %DUMP_DIR% rem =============================================================================== =========== rem 本批处理实现支持expdp数据泵的Oracle数据库版本的数据库逻辑备份,流程为:导出数据到

oracle执行计划解释

oracle执行计划解释 一.相关概念 1·rowid,伪列:就是系统自己给加上的,每个表都有一个伪列,并不是物理存在。它不能被修改,删除,和添加,rowid在该行的生命周期是唯一的,如果向数据库插入一列,只会引起行的变化,但是rowid并不会变。 2·recursive sql概念:当用户执行一些SQL语句时,会自动执行一些额外的语句,我们把这些额外的SQL语句称为“recursive calls” 或者是“recursive sql statement”,当在执行一个DDL语句时,Oracle总会隐含的发出一些Recursiv sql语句,用于修改数据字典,如果数据字典没有在共享内存中,则就执行“resursive calls”,它会把数据字典从物理读取到共享内存。当然DML和select语句都可能引起recursive SQL。 3·row source 行源:在查询中,由上一操作返回的符合条件的数据集,它可能是整个表,也可能是部分,当然也可以对2个表进行连接操作(join)最后得到的数据集4·predicate:一个查询中的where限制条件 5·driving table 驱动表:该表又成为外层表,这个感念用于内嵌和HASH连接中,如果返回数据较大,会有负面影响,返回行数据较小的适合做驱动表 6·probed table 被探查表:该表又称为内层表,我们在外层表中取得一条数据,在该表中寻找符合连接的条件的行。 7·组合索引(concatenated index)由多个列组成的索引,在组合索引中有一个重要的概念,就是引导索引, create index idx_tab on tab(col1,col2,col3), indx_tab则称为组合索引, col1则称为引导列 在查询条件where后,必须使用引导索引,才会使用该组合索引 8.可选择性(selectivity)比较一下列中唯一键的数量和表中的行数,就可以判断该列的可选择性。如果该列的“唯一键的数量/表中的行数”的比值越接近1,则该列的可选择性越高,该列就越适合创建索引,同样索引的可选择性也越高。在可选择性高的列上进行查询时,返回的数据就较少,比较适合使用索引查询。 二.Oracle访问数据的存取方法 1.全表扫描(Full tabel scans,FTS) 为了实现全表扫描,Oracle读取数据库中的每一行,并检查每一行是否满足语句的where 限制条件一个多块读操作,可以使io能读取多块数据块。减少了IO次数,提高了系统的吞吐量。在多块读的方法的使用下,可以高效的实现数据库全表扫描,而且,中有在全表扫描的情况下,在可以使用多块读的方法。在这个种访问模式下,数据块只读一次。 【注意】 使用FTS的前提是,在较大的表中,不建议使用FTS,除非取出的数据较多,超过总量的5%-10%,或者使用并行查询时 2.通过rowid的表存取 行的ROWID指向了该行的数据文件,数据块,以及在数据块中的位置,使用rowid能快速的定位到要取得数据的行上,在Oracle中,这是取得单行最快的方式。 【注意】 该存取方法,不会用到多块读操作,一次IO只能读取一个数据块。 3.索引扫描(index scan 和index lookup) 索引扫描时通过index查找到对应行的rowid,然后通过rowid从数据库中得到具体的数据。该方法分为两个步骤,

oracle的定时任务

一个简单的Oracle定时任务 2008-07-23 15:41:42 浏览(263) 一、在PLSQL中创建表: create or replace table TESTTIME ( CARNO VARCHAR2(30), CARINFOID NUMBER ); 二、在PLSQL中创建存储过程: create or replace procedure pro_test AS carinfo_id number; BEGIN select 'aa' into carinfo_id from dual; insert into TESTTIME(TESTTIME.carno,TESTTIME.carinfoid) values(carinfo_id,'123'); commit; end pro_test; 三、在SQL命令窗口中启动任务: 在SQL>后执行: VARIABLE jobno number; begin DBMS_JOB.SUBMIT(:jobno,'pro_test;',SYSDATE,'sysdate+1/24/12'); commit; end; / 注意:此处的/一定不能丢。Dbms_job.submit(job => :jobno, what => ’pro_test;’, next_date => to_date(‘20081025000000’,’yyyymmddhh24miss’)); 注意符号: jobno前面的冒号, 和pro_test后面的分号 提交后提示: PL/SQL procedure successfully completed jobno ---------

sqlplus中查看执行计划分析

sqlplus中查看执行计划分析 对于oracle9i,需要手工设置plustrace角色,步骤如下: 1、在SQL>connect sys/密码as sysdba (密码为:数据库所在的那台服务器的密码) 在sys用户下运行$ORACLE_HOME/sqlplus/admin/plustrce.sql SQL>@$ORACLE_HOME/sqlplus/admin/plustrce.sql 这段sql的实际内容如下: set echo on drop role plustrace; create role plustrace; grant select on v_$sesstat to plustrace; grant select on v_$statname to plustrace; grant select on v_$mystat to plustrace; grant plustrace to dba with admin option; set echo off 以上产生plustrace角色 2、在sys用户下把此角色赋予一般用户 SQL> grant PLUSTRACE to 用户名; (用户名为:当前你登陆数据库的用户名,如:bbass) 3、然后在当前用户下运行$ORACLE_HOME/rdbms/admin/utlxplan.sql SQL>@$ORACLE_HOME/rdbms/admin/utlxplan.sql 它会创建一个plan_table,用来存储分析SQL语句的结果。 4、SQL> set timing on 可查看SQL语句执行的用时 SQL> set autotrace on; 可查看SQL执行计划分析。 关于Autotrace几个常用选项的说明: SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式

oracle执行计划学习文档

oracle执行计划学习文档 一、O racl e 执行SQL的步骤 1.1、SQL 语句的两种类型 DDL语句,不共享,每次执行硬解析; DML语句,会共享,硬解析或者软解析。 1.2、SQL执行步骤 1、语法检测。判断一条SQL语句的语法是否符合SQL的规范; 2、语义检查。语法正确的SQL语句在解析的第二个步骤就是判断该SQL语句所访问的表及列是否准确?用户是否有权限访问或更改相应的表或列? 3、检查共享池中是否有相同的语句存在。假如执行的SQL语句已经在共享池中存在同样的副本,那么该SQL语句将会被软解析,也就是可以重用已解析过的语句的执行计划和优化方案,可以忽略语句解析过程中最耗费资源的步骤,这也是我们为什么一直强调避免硬解析的原因。这个步骤又可以分为两个步骤: (1)验证SQL语句是否完全一致。 (2)验证SQL语句执行环境是否相同。比如同样一条SQL语句,一个查询会话加了/*+ first_rows */的HINT,另外一个用户加/*+ all_rows */的HINT,他们就会产生不同的执行计划,尽管他们是查询同样的数据。 通过如上三个步骤检查以后,如果SQL语句是一致的,那么就会重用原有SQL语句的执行计划和优化方案,也就是我们通常所说的软解析。如果SQL语句没有找到同样的副本,那么就需要进行硬解析了。 4、Oracle根据提交的SQL语句再查询相应的数据对象是否有统计信息。如果有统计信息的话,那么CBO将会使用这些统计信息产生所有可能的执行计划(可能多达成千上万个)和相应的Cost,最终选择Cost最低的那个执行计划。如果查询的数据对象无统计信息,则按RBO的默认规则选择相应的执行计划。这个步骤也是解析中最耗费资源的,因此我们应该极力避免硬解析的产生。至此,解析的步骤已经全部完成,Oracle将会根据解析产生的执行计划执行SQL语句和提取相应的数据。

oracle定时任务

今天总结下oracle的任务队列管理器(job queue ),以后也方便查询. 我们要做定时任务时,有两种办法 一种是: 操作系统的定时,win的定时任务,unix的crontab 一种是: 数据库级的定时,她的效率更高, 再有大量的表级操作时,建议用数据库本身的job queue,这样方便,效率高;如果用系统级定时, 会增加很多编程工作,成本增加了,还很容易出错,事情越简单出错的几率越小. 再使用job queue之前,我们还要简单配置下,oracle定时执行job queue 的后台进程是SNP,要启动 snp,首先看系统模式是否支持 sql> alter system enable restricted session; 或 sql> alter system disenable restricted session; 利用上面的命令更改系统的会话方式为disenable restricted,为snp的启动创建条件. 再有就是配置job queue的启动参数,snp的启动参数位于oracle的初始化文件中, job_queue_processes=10 (oracle10gde 默认值) job_queue_interval=N 第一行定义snp进程的启动个数为10,正常得女冠一范围是0-36,根据任务的多少,可以配置不同的数值. 第二行定义系统每隔几秒唤醒该进程一次.缺省是60,正常范围是1-3600秒.事实上,该进程执行完 当前任务后,就进入睡眠状态,睡眠一段时间后,由系统的总控负责将其唤醒。 如果该文件中没有上面两行,请按照如上配置添加。配置完成后,需要重新启动数据库,使其生效。注意:如果任务要求执行的间隔很短的话,N的配置也要相应地小一点。 查看job queue的详细信息,查询数据库字典user_jobs sql> select job,next_date,next_sec,broken from user_jobs; 包含以下子过程: Broken()过程。 change()过程。 Interval()过程。 Isubmit()过程。 Next_Date()过程。 Remove()过程。 Run()过程。 Submit()过程。 User_Export()过程。 What()过程。 1、Broken()过程更新一个已提交的工作的状态,典型地是用来把一个已破工作标记为未破工作。 这个过程有三个参数:job 、broken与next_date。

oracle-SQL语句执行原理和完整过程详解

SQL语句执行过程详解 一条sql,plsql的执行到底是怎样执行的呢? 一、SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行select 语句时,客户端会把这条SQL 语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL 语句发送给服务器端。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用事不相同的。服务器上的数据库进程才会对SQL 语句进行相关的处理。不过,有个问题需要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。 第二步:语句解析 当客户端把SQL 语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作, 其会做很多小动作。 也是在服务器端所进行的。虽然这只是一个解析的动作,但是,“” 1. 查询高速缓存(library cache)。服务器进程在接到客户端传送过来的SQL 语句时,不 会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在数据高速缓存中,则服务器进程就会直接执行这个SQL 语句,省去后续的工作。所以,采用高速数据缓存的话,可以提高SQL 语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取数据效率要高,另一方面,也是因为这个语句解析的原因。 不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存不是一码事。 2. 语句合法性检查(data dict cache)。当在高速缓存中找不到对应的SQL 语句时,则服 务器进程就会开始检查这条语句的合法性。这里主要是对SQL 语句的语法进行检查,看看其是否合乎语法规则。如果服务器进程认为这条SQL 语句不符合语法规则的时候,就会把这个错误信息,反馈给客户端。在这个语法检查的过程中,不会对SQL 语句中所包含的表名、列名等等进行SQL 他只是语法上的检查。 3. 语言含义检查(data dict cache)。若SQL 语句符合语法上的定义的话,则服务器进程 接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不准确的话,则数据库会就会反馈错误信息给客户端。所以,有时候我们写select 语句的时候,若语法与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名错误。 4. 获得对象解析锁(control structer)。当语法、语义都正确后,系统就会对我们需要查询的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发生改变。 5. 数据访问权限的核对(data dict cache)。当语法、语义通过检查之后,客户端还不一定 能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器

TOAD中查看SQL的执行计划

TOAD中查看SQL的执行计划 一、TOAD中查看SQL的执行计划: 1、点击工具栏上120救护车图标按钮 2、快捷键Ctrl+E 3、菜单View-Explain plan 二、如果是默认安装TOAD,在查看执行计划时会报一个错: ORA-02404: 未找到指定的计划表 稍微研究了一下,解决这个问题基本上有3个方案: 1、最直接的解决方案:直接创建TOAD所需要的计划表,该脚本在%oracle_home%\rdbms\admin\utlxplan.sql 中,不过该脚本是创建PLAN_TABLE表,表结构一样,改名为TOAD_PLAN_TABLE 即可。如下: CREATE TABLE TOAD_PLAN_TABLE ( STATEMENT_ID VARCHAR2 (32), TIMESTAMP DATE, REMARKS VARCHAR2 (80), OPERATION VARCHAR2 (30), OPTIONS VARCHAR2 (30), OBJECT_NODE VARCHAR2 (128), OBJECT_OWNER VARCHAR2 (30), OBJECT_NAME VARCHAR2 (30), OBJECT_INSTANCE NUMBER, OBJECT_TYPE VARCHAR2 (30), SEARCH_COLUMNS NUMBER, ID NUMBER, COST NUMBER, PARENT_ID NUMBER, POSITION NUMBER, CARDINALITY NUMBER, OPTIMIZER VARCHAR2 (255), BYTES NUMBER, OTHER_TAG VARCHAR2 (255), OTHER LONG, PARTITION NUMBER, PARTITION_START VARCHAR2 (255), PARTITION_STOP VARCHAR2 (255), DISTRIBUTION VARCHAR2 (30) ) ; 2、偷机取巧的处理方案:修改TOAD参数 将菜单View -> Options ->Oracle -> General -> Explain Plan Table name中的参数修改为PLAN_TABLE即可使用。 3、通过TOAD自带功能创建表结构: 在菜单tools -> server side objects wizard下运行,不过要建立一些对象,最好建议一个单独的表空间放这些对象。 在10g中带有plan_table这张表,但是将名字改为了plan_table$ 只需$ORACLE_HOME/sqlplus/admin/plustrce.sql创建plustrace角色 grant plustrace to public

ORACLE大数据库自动备份_详细步骤

ORACLE数据库自动备份 由于每天都需要备份数据库,每天都写一遍备份语句很是麻烦,所以我从网上找到了一个window下编写批处理文件实现自动备份的方法: 备份代码 首先我们需要编写一个批处理文件,用于实现数据库的备份功能,粘贴如下代码到文本文档中,重新命名为***.bat(后缀名修改为bat): 然后将下面代码复制到文本文档中:(红色字体是需要修改的地方) @echo off color 0b mode con cols=80 lines=25 echo 正在备份数据库,请稍后…… echo -------------------------------------- echo 指定数据库用户(在“=”后面写入你需要备份的数据库登录用户名) set yh=si0001 echo 指定数据库密码(在“=”后面写入你需要备份的数据库登录密码) set mm=si0001 echo 指定数据库服务名(在“=”后面写入你需要备份的数据库

服务名) set fwm=10.1.94.21/orcl echo 指定备份目录(指定备份的文件夹,以“\”结束) set ml=d:\backupOracle\ echo ---------------------------------------------- echo 开始计算日期和时间,用于备份文件的名称(由于是自动备份,备份的文件名我们定义为数据库登录名+系统时间—精确到秒) set hh=%time:~0,2% echo 如果小时是一位的,那么在前面补零 if /i %hh% LSS 10 (set hh=0%time:~1,1%) set rq=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2% set sj=%hh%%TIME:~3,2%%TIME:~6,2% set wjm=%yh%%rq%%sj% echo ---------------------------------------------- echo 请核对以下数据是否正确 echo 用户名:%yh% echo 密码:%mm% echo 服务名:%fwm%

Oracle定时执行计划任务.

Oracle 定时执行计划任务 Oracle 在 10g 版本以前, 计划任务用的是 DBMS_JOB包, 10g 版本引入 DBMS_SCHEDULER来替代先前的 DBMS_JOB,在功能方面 , 它比 DBMS_JOB提供了更强大的功能和更灵活的机制管理, 但 DBMS_JOB包的使用相对比较简单, 也基本能够满足定时执行计划任务的需求, 故接下来就先看看 DBMS_JOB包的使用方法。 1. DBMS_JOB 我们可以在命令窗口输入 show parameter job_queue_processes查看数据库中定时任务的最多并发数,一般设置为 10(设置方法:alter system set job_queue_processes=10 ,如果设为 0,那么数据库定时作业是不会运行的。 oracle 定时执行 job queue 的后台进程是 SNP , 要启动 snp, 首先看系统模式是否支持 sql> alter system enable restricted session;或 sql> alter system disenable restricted session; 利用上面的命令更改系统的会话方式为 disenable restricted,为 snp 的启动创建条件 . 接下来我们尝试实现以下功能:每隔一分钟自动向 job_test表中插入当前的系统时间。 1、创测试表 create table job_test(updatetime date; 2、创建 JOB variable v_job_no number; begin dbms_job.submit(:v_job_no, 'insert into job_test values(sysdate;', sysdate, 'sysdate+1/1440';

Oracle定时执行计划任务

Oracle定时执行计划任务 Oracle在10g版本以前,计划任务用的是DBMS_JOB包,10g版本引入DBMS_SCHEDULER 来替代先前的DBMS_JOB,在功能方面,它比DBMS_JOB提供了更强大的功能和更灵活的机制管理,但DBMS_JOB包的使用相对比较简单,也基本能够满足定时执行计划任务的需求,故接下来就先看看DBMS_JOB包的使用方法。 1.DBMS_JOB 我们可以在命令窗口输入show parameter job_queue_processes查看数据库中定时任务的最多并发数,一般设置为10(设置方法:alter system set job_queue_processes=10),如果设为0,那么数据库定时作业是不会运行的。 oracle定时执行job queue 的后台进程是SNP,要启动snp,首先看系统模式是否支持sql> alter system enable restricted session;或sql> alter system disenable restricted session; 利用上面的命令更改系统的会话方式为disenable restricted,为snp的启动创建条件. 接下来我们尝试实现以下功能:每隔一分钟自动向job_test表中插入当前的系统时间。 1、创测试表 create table job_test(updatetime date); 2、创建JOB variable v_job_no number; begin dbms_job.submit(:v_job_no, 'insert into job_test values(sysdate);', sysdate, 'sysdate+1/1440'); end; / 其中最后一个参数'sysdate+1/1440'表示时间间隔为每分钟。其它常用的时间间隔的设置如下: (1)如果想每天凌晨1点执行,则此参数可设置为'trunc(sysdate)+25/24'; (2)如果想每周一凌晨1点执行,则此参数可设置为 'trunc(next_day(sysdate,1))+25/24'; (3)如果想每月1号凌晨1点执行,则此参数可设置为 'trunc(last_day(sysdate))+25/24'; (4)如果想每季度执行一次,则此参数可设置为 'trunc(add_months(sysdate,3),'Q')+1/24';

执行计划详解

简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 Rowid的概念 Recursive Sql概念 Predicate(谓词) DRiving Table(驱动表) Probed Table(被探查表) 组合索引(concatenated index) 可选择性(selectivity) 二.oracle访问数据的存取方法 1)全表扫描(Full Table Scans, FTS) 2)通过ROWID的表存取(Table Access by ROWID或rowid lookup) 3)索引扫描(Index Scan或index lookup)有4种类型的索引扫描:(1)索引唯一扫描(index unique scan) (2)索引范围扫描(index range scan) 在非唯一索引上都使用索引范围扫描。使用index rang scan的3种情况: (a)在唯一索引列上使用了range操作符(> < <> >= <= between) (b)在组合索引上,只使用部分列进行查询,导致查询出多行 (c)对非唯一索引列上进行的任何查询。 (3)索引全扫描(index full scan) (4)索引快速扫描(index fast full scan) 三、表之间的连接 1,排序 - - 合并连接(Sort Merge Join, SMJ) 2,嵌套循环(Nested Loops, NL) 3,哈希连接(Hash Join, HJ) 另外,笛卡儿乘积(Cartesian Product) 总结Oracle连接方法 Oracle执行计划总结概述 +++ 一.相关的概念

Oracle自动备份详细步骤

Oracle自动备份详细步骤 背景:Oracle10g 服务器,Oracle10g 客户端,windowsXP 操作平台 要求:Oracle 数据库服务器对数据库 ytcn 每天自动备份一次。 解决方案:利用任务计划、批处理文件和 Oracle 的 exp 导出功能,根据日期自动生成 Oracle 备份文件。详细步骤: 1 创建批处理文件 ytcn.bat ytcn.bat中详细内容如下: @echo off echo 正在备份 Oracle 数据库,请稍等...... exp userid= ytcn / ytcn @orcl as sysdba file= e:/bak/ytcn/oracle/ ytcn %date:~0,4%%date:~5,2%%date:~8,2%.dmp log= e:/bak/ytcn/oracle / ytcn %date:~0,4%%date:~5,2%%date:~8,2%.log full=y echo 任务完成! 其中红色部分是根据需要进行变动的地方,例如作者的项目名“银通网”,数据库 ytcn 用户名 ytcn,密码 ytcn,要在目录 "e:/bak/ytcn/oracle/" 下生成形如 "ytcn20090711.dmp" 和 "ytcn20090711.log" 的备份和日志文件,全表导出。 另外:%date%的值在不同的系统、语言版本下可能是不一样的,控制面板里面区域选项的设定也会改变%date% 的值。请先在命令行中测试echo %date% 的返回值。%date:~4,10% 是返回日期函数,~后的第一个参数是要截取的起始位置(从0开始),第二个参数是要截取的长度,如没有则是截取到最后,参数可酌情修改。如需要准确的时间做为文件名,请用%time%函数,参数同上。 2 添加一个任务计划 ytcn 开始 >所有程序 >附件 >系统工具 >任务计划 >添加任务计划 >下一步 >在浏览中查找刚刚写好的 ytcn.bat 文件 >任务名输入ytcn,执行这个任务选择每天,下一步 >起始时间下午12:00,起始日期2009-7-11,下一步 >输入用户名及密码,用户名要求是管理员权限用户名,下一步 >完成 点击"完成"之后,会在任务计划栏目下新增一个名为"ytcn"的任务计划,表明已经配置完毕。 备注:有时点击"完成" 之后,系统警告 "已创建新任务,但可能不能运行,因为无法设置账户信息。 指定的错误是:

半小时看懂Oracle的执行计划

一、什么是执行计划 An explain plan is a representation of the access path that is taken when a query is executed within Oracle. 二、如何访问数据 At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods: Full Table Scan (FTS) --全表扫描 Index Lookup (unique & non-unique) --索引扫描(唯一和非唯一) Rowid --物理行id 三、执行计划层次关系 When looking at a plan, the rightmost (ie most inndented) uppermost operation is the first thing that is executed. --采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行 1、看一个简单的例子: Query Plan ----------------------------------------- SELECT STATEMENT [CHOOSE] Cost=1234 **TABLE ACCESS FULL LARGE [:Q65001] [ANALYZED]--[:Q65001]表示是并行方式,[ANALYZED]表示 该对象已经分析过了 优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采用CBO还是RBO: SELECT STATEMENT [CHOOSE] Cost=1234 --Cost有值,采用CBO SELECT STATEMENT [CHOOSE] Cost= --Cost为空,采用RBO

Job的定时任务

Oracle Job定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 一、查询系统中的job,可以查询视图 --相关视图 select * from dba_jobs; select * from all_jobs; select * from user_jobs; -- 查询字段描述 /* 字段(列)类型描述 JOB NUMBER 任务的唯一标示号 LOG_USER VARCHAR2(30) 提交任务的用户 PRIV_USER VARCHAR2(30) 赋予任务权限的用户 SCHEMA_USER VARCHAR2(30) 对任务作语法分析的用户模式 LAST_DATE DATE 最后一次成功运行任务的时间 LAST_SEC VARCHAR2(8) 如HH24:MM:SS格式的last_date日期的小时,分钟和秒 THIS_DATE DATE 正在运行任务的开始时间,如果没有运行任务则为 null THIS_SEC VARCHAR2(8) 如HH24:MM:SS格式的this_date日期的小时,分钟和秒 NEXT_DATE DATE 下一次定时运行任务的时间 NEXT_SEC VARCHAR2(8) 如HH24:MM:SS格式的next_date日期的小时,分钟和秒 TOTAL_TIME NUMBER 该任务运行所需要的总时间,单位为秒 BROKEN VARCHAR2(1) 标志参数,Y标示任务中断,以后不会运行INTERVAL VARCHAR2(200) 用于计算下一运行时间的表达式

FAILURES NUMBER 任务运行连续没有成功的次数 WHAT VARCHAR2(2000) 执行任务的PL/SQL块 CURRENT_SESSION_LABEL RAW MLSLABEL 该任务的信任Oracle会话符CLEARANCE_HI RAW MLSLABEL 该任务可信任的Oracle最大间隙CLEARANCE_LO RAW MLSLABEL 该任务可信任的Oracle最小间隙 NLS_ENV VARCHAR2(2000) 任务运行的NLS会话设置 MISC_ENV RAW(32) 任务运行的其他一些会话参数 */ -- 正在运行job select * from dba_jobs_running; 其中最重要的字段就是job 这个值就是我们操作job的id号,what 操作存储过程的名称,next_date 执行的时间,interval执行间隔 二、执行间隔interval 运行频率 描述 INTERVAL参数值 每天午夜12点 TRUNC(SYSDATE + 1) 每天早上8点30分 TRUNC(SYSDATE + 1) + (8*60+30)/(24*60) 每星期二中午12点 NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24 require.async(['wkcommon:widget/ui/lib/sio/sio.js'], function(sio) { var url = 'https://https://www.doczj.com/doc/538859883.html,/cpro/ui/c.js'; sio.callByBrowser( url, function () { BAIDU_CLB_fillSlotAsync('u2845605','cpro_u2845605'); } ); });

相关主题
文本预览
相关文档 最新文档