job調用存儲過程
❶ ORACLE 中user_jobs調用 存儲過程
你這個就是我給你寫的吧?
在里邊執行下邊的,把下邊這些放到job里:
DECLARE
on_flag NUMBER;
out_reason VARCHAR2(4000);
BEGIN
-- Now call the stored program
sp_create_table(on_flag,out_reason);
-- Output the results
:a0 := on_flag;
:a1 := out_reason;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SubStr('Error '||TO_CHAR(sqlCODE)||': '||SQLERRM, 1, 255));
RAISE;
END;
對了,還不行的話你就換個工具,換toad,找到job,時間設置好了
還有,大妹子,你分真多,哈
不好意思啊,我這老報一個ora-01008的錯誤輪畝悶,沒弄明白
---------------------------------------------------------------------
OK,解決,那些亂七八糟的要綁定變數,程序耐粗和臘彎執行的你都改一下吧
程序改成:
create or replace PROCEDURE SP_CREATE_TABLE
(
on_flag OUT NUMBER,
out_reason OUT VARCHAR2
)
is
v_sql varchar2(2000);
v_now_date varchar2(8);
v_table_name varchar2(3);
begin
select to_char(sysdate,'yyyymmdd') into v_now_date from al;
select 'xin' into v_table_name from al;
v_sql :='create table '||v_table_name||''||v_now_date||' as select * from abc';
EXECUTE IMMEDIATE v_sql;
commit;
EXCEPTION
WHEN OTHERS
THEN
on_flag := SQLCODE;
out_reason := SUBSTR (SQLERRM, 1, 255);
ROLLBACK;
END;
程序執行體改成:
DECLARE
on_flag NUMBER;
out_reason VARCHAR2(4000);
BEGIN
-- Now call the stored program
sp_create_table(on_flag,out_reason);
END;
應該是萬無一失了,再有問題留言吧
❷ 怎樣實現每天自動執行oracle的存儲過程一次
用job
oracle定時器調用存儲過程
1.創建一個表,為了能清楚看到定時器的運行情況我們創建一個帶有日期欄位的表
Sql代碼
create table job_table(run_time date);
create table job_table(run_time date);
2.創建存儲過程
Sql代碼
create or replace procere job_proc is
begin
insert into job_table (run_time) values (sysdate);
end;
create or replace procere job_proc is
begin
insert into job_table (run_time) values (sysdate);
end;
3.創建job,並且指定為一分鍾執行一次
Sql代碼
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');
end/
commit;
declare
job number;
begin
dbms_job.submit(job, 'job_proc;', sysdate, 'TRUNC(sysdate,''mi'') + 1 / (24*60)');
end/
commit;
4.創建之後自動處於運行狀態,我們查詢job表,看看我們創建的job
Sql代碼
select job,broken,what,interval,t.* from user_jobs t;
select job,broken,what,interval,t.* from user_jobs t;
job broken what interval ...
81 N job_proc; TRUNC(sysdate,'mi') + 1 / (24*60) ...
參數介紹
job job的唯一標識,自動生成的
broken 是否處於運行狀態,N;運行;Y:停止
what 存儲過程名稱
interval 定義的執行時間
補充:
描述 INTERVAL參數值
每天午夜12點 ''TRUNC(SYSDATE + 1)''
每天早上8點30分 ''TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)''
每星期二中午12點 ''NEXT_DAY(TRUNC(SYSDATE ), ''''TUESDAY'''' ) + 12/24''
每個月第一天的午夜12點 ''TRUNC(LAST_DAY(SYSDATE ) + 1)''
每個季度最後一天的晚上11點 ''TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ''Q'' ) -1/24''
每星期六和日早上6點10分 ''TRUNC(LEAST(NEXT_DAY(SYSDATE, ''''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + (6×60+10)/(24×60)''
❸ Oracle資料庫job,調用存儲過程,PLSQL工具執行後,沒有報錯,但是也沒有任何效果,哪位大神幫忙分析一下
SQL> create or replace procere test_jobproce as
2
3 begin
4
5 insert into test_job values(sysdate);
6
7 end test_jobproce;
8
9 /
警告: 創建的過程帶有編譯錯誤。
SQL> show errors;
PROCEDURE TEST_JOBPROCE 出現錯誤:
LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1 PL/SQL: SQL Statement ignored
5/13 PL/SQL: ORA-00942: 表或視圖不存在
SQL> create table test_job (t1 date);
表已創建。
SQL> create or replace procere test_jobproce as
2
3 begin
4
5 insert into test_job values(sysdate);
6
7 end test_jobproce;
8 /
過程已創建。
SQL> declare test_job_really number;
2 begin
3 dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'sysdate+1/1440')
4 commit;
5 end;
6 /
PL/SQL 過程已成功完成。
SQL> rpitn :test_job_really;
SP2-0734: 未知的命令開頭 "rpitn :tes..." - 忽略了剩餘的行。
SQL> print :test_job_really;
SP2-0552: 未聲明綁定變數 "TEST_JOB_REALLY"。
SQL> desc dba_jobs;
名稱 是否為空? 類型
----------------------------------------- -------- ---------------------------
JOB NOT NULL NUMBER
LOG_USER NOT NULL VARCHAR2(30)
PRIV_USER NOT NULL VARCHAR2(30)
SCHEMA_USER NOT NULL VARCHAR2(30)
LAST_DATE DATE
LAST_SEC VARCHAR2(8)
THIS_DATE DATE
THIS_SEC VARCHAR2(8)
NEXT_DATE NOT NULL DATE
NEXT_SEC VARCHAR2(8)
TOTAL_TIME NUMBER
BROKEN VARCHAR2(1)
INTERVAL NOT NULL VARCHAR2(200)
FAILURES NUMBER
WHAT VARCHAR2(4000)
NLS_ENV VARCHAR2(4000)
MISC_ENV RAW(32)
INSTANCE NUMBER
SQL> select job ,what from dba_jobs;
JOB
----------
WHAT
-------------------------------------------------------------------------------
4001
wwv_flow_cache.purge_sessions(p_purge_sess_older_then_hrs => 24);
4002
wwv_flow_mail.push_queue(wwv_flow_platform.get_preference('SMTP_HOST_ADDRESS'),
wv_flow_platform.get_preference('SMTP_HOST_PORT'));
3
test_jobproce;
JOB
----------
WHAT
-------------------------------------------------------------------------------
SQL> exec dbms_job.run(3);
PL/SQL 過程已成功完成。
SQL> select * from test_job
2 ;
T1
--------------
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
SQL> exec dbms_job.run(3);
PL/SQL 過程已成功完成。
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
05-3月 -14
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
05-3月 -14
SQL> exec dbms_job.run(3);
PL/SQL 過程已成功完成。
SQL> /
T1
--------------
05-3月 -14
05-3月 -14
05-3月 -14
05-3月 -14
SQL>
❹ oracle瀛樺偍榪囩▼濡備綍騫惰岋紵
A1 A2 A3涔熸槸瀛樺偍榪囩▼鍚楋紵 job鍏跺疄涓婁篃鍙鏄鍒嗗埆璋冪敤榪欏嚑涓榪囩▼鏉ユ墽琛岋紝鑰屼笉鏄闈犳墽琛屼竴涓獮灝卞彲浠ヨ╂墍鏈堿1 2 3 4 騫惰屾墽琛岀殑銆 濡傛灉A1 2 3 4閮芥槸闇瑕佸弬鏁扮殑璇濓紝閭d箞浣犱篃鍙鏈夌敤A鍒嗗紑緇欐瘡涓涓閮戒紶閫掑弬鏁幫紝鍚﹀垯鐨勮瘽涔熸槸涓嶈兘騫惰屾墽琛岀殑銆 渚嬪傦細
declare n number
begin
dbms_job.submit('a1;a2;a3;a4',sysdate,'trunc(sysdate+1)');
commit;
end;
/
榪欐牱浼氳゛1 2 3 4鍒嗗埆鍚屾椂鎵ц岋紝浣犲彲浠ュ仛涓涓鏀瑰姩灝辨槸璁゛緇檃*浼犻掑弬鏁扮殑鍔ㄤ綔 鐩存帴鍔犲叆鍒癮 1 2 3 4鐨勮繃紼嬪綋涓鎵嶅彲浠ャ
❺ 想請教一下如何用oracle 中JOB實現定時存儲過程。
如果是10g的話就用scheler來代替job吧,比job穩定多了。
先解釋一下基礎概念,scheler 包含了以下幾個實體對象
Program -- 提供了scheler 將要運行什麼,包含program name,program type(PLSQL塊、存儲過程、外部程序),program action(具體的程序實體,比如說一個PLSQL塊、或者是存儲過程的名稱、或者是外部程序的路徑加名稱) 。
Scheles -- 指定何時何種頻率來運行job,可以被不同的job重復的利用。比如說我有兩個job都要求在每天的凌晨4點運行,那麼兩個job可以同時指定相同的schele。
Jobs -- 具體的作業的名稱,依賴於那個program、schele。也可以不指定program、schele,而直接寫入program、schele的相應參數。
Chains -- 把一組program像一個單獨的實體連接在一起,作為一個對象。Job可以指向Chains代替單一的program 。這樣就能完成類似如下功能:運行A,然後運行B,當A、B都運行成功則運行C,否則運行D。
下面參考文檔邊看邊做。
1.創建一張表 create table scheler_test(id number,instime date);
2.創建一個存儲過程,實現往表中插入資料。
create or replace procere p_insSysdate as
id number;
begin
select count(*) into id from scheler_test;
insert into scheler_test values(id,sysdate);
commit;
end;
/
3.創建一個schele,這個僅僅是一個時間上的安排,由DBMS_SCHEDULER.CREATE_JOB調用。這樣就可以重用schele,並且schele在時間的安排上強大與原先的JOB 。語法如下:
BEGIN
SYS.DBMS_SCHEDULER.CREATE_SCHEDULE
(
schele_name => 'SCOTT.EVERY_MINUTE'
,start_date => NULL
,repeat_interval => 'FREQ=MINUTELY'
,end_date => NULL
,comments => NULL
);
END;
/
以下給出部分repeat_interval的寫法實例,以供參考
EVERY DAY 'FREQ=DAILY;INTERVAL=1'
EVERY MINUTE 'FREQ=MINUTELY;INTERVAL=1'
EVERY 4 HOURS ON THE HOUR 'FREQ=HOURLY;INTERVAL=4;BYMINUTE=0;BYSECOND=0'
1st DAY OF EVERY MONTH 'FREQ=DAILY;BYMONTHDAY=1'
WEEKDAYS AT 7am and 3pm 'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15; BYMINUTE=0;BYSECOND=0'
4.創建DBMS_SCHEDULER.CREATE_PROGRAM,指定運行什麼樣的程序。
BEGIN
SYS.DBMS_SCHEDULER.CREATE_PROGRAM
(
program_name => 'SCOTT.PRG_INSSYSDATE'
,program_type => 'STORED_PROCEDURE'
,program_action => 'p_insSysdate'
,number_of_arguments => 0
,enabled => TRUE
,comments => NULL
);
END;
/
❻ 請問oracle怎麼執行存儲過程
我試驗過了,就是exec 存儲過程名或者execute 存儲過程名(參數),請你在仔細確認一下,你的存儲過程名寫沒寫對呀,或者你沒有進入sqlplus中?
----
以上,希望對你能有幫助。