oraclejob存儲過程參數
lz你好,job調用的存儲過程不能是帶參數的,只能是無參數的存儲過程,所以what那裡不對的哦。
㈡ oracle存儲過程參數的問題
方案1:(1)傳入前將單位拼接為串,格式如下:『單位1,單位2,單位3',即'43,4301',用逗號分割數據。(2)查詢條件修改如雹攔下: where instr(傳入的串,單位所在列)>0; (3)注意 單位這個列不能有空的情況,否則需要加上nvl(單位,『@』),字元可以自擬;方案2:傳入前將復選後的單位放入PL/sql表,再將PL/SQL表作為參數進行傳遞; 如果復選的不是很大,沒有超過varchar2(4000)的話,方行肆禪案1能實現。注意檔塵對參數最好加限制substrb(單位串,1,你期望的限制),這個限制可依據性能而定,一般復選框也不會一頁顯式太多,所以不必擔心串的大小。 藍屏
㈢ oracle中怎麼執行帶有輸出參數的存儲過程,在程序中我知道怎麼調用,
1、新建一個存儲過程(Procere)。
㈣ oracle資料庫job怎麼調用含參數的存儲過程
dbms_job.submit(test_job_really,'test_jobproce("zhangsan");',sysdate,'sysdate+1/1440');
改為:
dbms_job.submit(test_job_really,'test_jobproce(''zhangsan'');',sysdate,'sysdate+1/1440');
注意:zhangsan的兩邊,不是雙引號,是兩個單引號!
如有幫助,請採納!
㈤ oracle存儲過程,為什麼創建的時候還要傳參數不是應該調用的時候傳嗎
你理解是對的,存儲過程在創建的時候是不需要輸入參數的,只有在調用的時候才需要傳遞參數。
首先,存儲過程中你定義參數的時候沒有指定輸入輸出,vsalary IN ,vsalary ,IN 或者OUT 輸出參數。
create or replace procere p_employee(vsalary IN number,vsalary2 IN number)
as.....
vsalary 和vsalary2即為變數名,在後面游標中直接使用變數名,不需要&vsalary 和&vsalary2。
按存儲過程規范來修改一下,,祝你成功。
㈥ oracle job 執行帶參數的存儲過程;每天定時將A表新產生的數據定期更新到B表中,存儲過程有一個時間參數
execute P_JBXX_NSZHDJXXB_NEW(TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss'))
㈦ 想請教一下如何用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 job定時調用一個有參的存儲過程
/*
查詢:
select job,broken,what,interval,t.* from user_jobs t;
job job的唯一標識,自動生成的
broken 是否處於運行狀態,N;運行;Y:停止
what 存儲過程名稱
next_date 初次執行時間
interval 執行周期
刪除:
begin dbms_job.remove(jobno); end;
根據what的內容確定其對應的job,並如此執行刪除
執行時間例子:
描述 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)''
每3秒鍾執行一次 'sysdate+3/(24*60*60)'
每2分鍾執行一次 'sysdate+2/(24*60)'
1:每分鍾執行
Interval => TRUNC(sysdate,'mi') + 1/ (24*60) --每分鍾執行
interval => 'sysdate+1/(24*60)' --每分鍾執行
interval => 'sysdate+1' --每天
interval => 'sysdate+1/24' --每小時
interval => 'sysdate+2/24*60' --每2分鍾
interval => 'sysdate+30/24*60*60' --每30秒
2:每天定時執行
Interval => TRUNC(sysdate+1) --每天凌晨0點執行
Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1點執行
Interval => TRUNC(SYSDATE+1)+(8*60+30)/(24*60) --每天早上8點30分執行
3:每周定時執行
Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 --每周一凌晨1點執行
Interval => TRUNC(next_day(sysdate,1))+2/24 --每周一凌晨2點執行
4:每月定時執行
Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每月1日凌晨0點執行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每月1日凌晨1點執行
5:每季度定時執行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') --每季度的第一天凌晨0點執行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'q') + 1/24 --每季度的第一天凌晨1點執行
Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),'q')-1/24 --每季度的最後一天的晚上11點執行
6:每半年定時執行
Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 --每年7月1日和1月1日凌晨1點
7:每年定時執行
Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24 --每年1月1日凌晨1點執行
相關方法:
修改要執行的操作:dbms_job.what(jobno,'sp_fact_charge_code;'); --修改某個job名
修改下次執行時間:dbms_job.next_date(job,next_date);
修改間隔時間:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
㈨ Oracle存儲過程及舉例(幾種參數情況的存儲
create table TESTTABLE
(
id1 VARCHAR2(12),
name VARCHAR2(32)
)
select t.id1,t.name from TESTTABLE t
insert into TESTTABLE (ID1, NAME)
values ('1', 'zhangsan');
insert into TESTTABLE (ID1, NAME)
values ('2', 'lisi');
insert into TESTTABLE (ID1, NAME)
values ('3', 'wangwu');
insert into TESTTABLE (ID1, NAME)
values ('4', 'xiaoliu');
insert into TESTTABLE (ID1, NAME)
values ('5', 'laowu');
---創建存儲過程
create or replace procere test_count
as
v_total number(1);
begin
select count(*) into v_total from TESTTABLE;
DBMS_OUTPUT.put_line('總人數:'||v_total);
end;
--准備
--線對scott解鎖:alter user scott account unlock;
--應為存儲過程是在scott用戶下。還要給scott賦予密碼
---alter user scott identified by tiger;
---去命令下執行
EXECUTE test_count;
----在ql/spl中的sql中執行
begin
-- Call the procere
test_count;
end;
create or replace procere TEST_LIST
AS
---是用游標
CURSOR test_cursor IS select t.id1,t.name from TESTTABLE t;
begin
for Test_record IN test_cursor loop---遍歷游標,在列印出來
DBMS_OUTPUT.put_line(Test_record.id1||Test_record.name);
END LOOP;
test_count;--同時執行另外一個存儲過程(TEST_LIST中包含存儲過程test_count)
end;
-----執行存儲過程TEST_LIST
begin
TEST_LIST;
END;
---存儲過程的參數
---IN 定義一個輸入參數變數,用於傳遞參數給存儲過程
--OUT 定義一個輸出參數變數,用於從存儲過程獲取數據
---IN OUT 定義一個輸入、輸出參數變數,兼有以上兩者的功能
--這三種參數只能說明類型,不需要說明具體長度 比如 varchar2(12),defaul 可以不寫,但是作為一個程序員最好還是寫上。
---創建有參數的存儲過程
create or replace procere test_param(p_id1 in VARCHAR2 default '0')
as v_name varchar2(32);
begin
select t.name into v_name from TESTTABLE t where t.id1=p_id1;
DBMS_OUTPUT.put_line('name:'||v_name);
end;
----執行存儲過程
begin
test_param('1');
end;
default '0'
---創建有參數的存儲過程
create or replace procere test_paramout(v_name OUT VARCHAR2 )
as
begin
select name into v_name from TESTTABLE where id1='1';
DBMS_OUTPUT.put_line('name:'||v_name);
end;
----執行存儲過程
DECLARE
v_name VARCHAR2(32);
BEGIN
test_paramout(v_name);
DBMS_OUTPUT.PUT_LINE('name:'||v_name);
END;
-------IN OUT
---創建存儲過程
create or replace procere test_paramINOUT(p_phonenumber in out varchar2)
as
begin
p_phonenumber:='0571-'||p_phonenumber;
end;
----
DECLARE
p_phonenumber VARCHAR2(32);
BEGIN
p_phonenumber:='26731092';
test_paramINOUT(p_phonenumber);
DBMS_OUTPUT.PUT_LINE('新的電話號碼:'||p_phonenumber);
END;
-----sql命令下,查詢當前用戶的存儲過程或函數的源代碼,
-----可以通過對USER_SOURCE數據字典視圖的查詢得到。USER_SOURCE的結構如下:
SQL> DESCRIBE USER_SOURCE ;
Name Type Nullable Default Comments
---- -------------- -------- -------
-------------------------------------------------------------------------------------------------------------
NAME VARCHAR2(30) Y Name of the object
TYPE VARCHAR2(12) Y Type of the object: "TYPE", "TYPE BODY", "PROCEDURE", "FUNCTION",
"PACKAGE", "PACKAGE BODY" or "JAVA SOURCE"
LINE NUMBER Y Line number of this line of
source
TEXT VARCHAR2(4000) Y Source text
SQL>
---查詢出存儲過程的定義語句
select text from user_source WHERE NAME='TEST_COUNT';
----查詢存儲過程test_paramINOUT的參數
SQL> DESCRIBE test_paramINOUT;
Parameter Type Mode Default?
------------- -------- ------ --------
P_PHONENUMBER VARCHAR2 IN OUT
SQL>
---查看當前的存儲過程的狀態是否正確,
---VALID為正確,INVALID表示存儲過程無效或需要重新編譯
SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='TEST_COUNT';
-----如果要檢查存儲過程或函數的依賴性,可以通過查詢數據字典USER_DENPENDENCIES來確定,該表結構如下:
SQL> DESCRIBE USER_DEPENDENCIES;
Name Type Nullable Default Comments
-------------------- ------------- -------- ------- ----------------------------------------------------------
NAME VARCHAR2(30) Name of the object
TYPE VARCHAR2(17) Y Type of the object
REFERENCED_OWNER VARCHAR2(30) Y Owner of referenced object (remote owner if remote object)
REFERENCED_NAME VARCHAR2(64) Y Name of referenced object
REFERENCED_TYPE VARCHAR2(17) Y Type of referenced object
REFERENCED_LINK_NAME VARCHAR2(128) Y Name of dblink if this is a remote object
SCHEMAID NUMBER Y
DEPENDENCY_TYPE VARCHAR2(4) Y
SQL>
---查詢存儲過程TEST_COUNT的依賴關系
SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='TEST_COUNT';
㈩ 關於ORACLE用JOBS調用存儲過程,該存儲過程已創建了,兩個OUT參數,如何在每天18點准時調用
BEGIN
sys.dbms_scheler.create_job(
job_name => '"JOB_名稱"',
job_type => 'PLSQL_BLOCK',
job_action => '
DECLARE
V_RQ VARCHAR2(10);--存儲過程需要的參數
V_FLG VARCHAR2(4000);--存儲過程需要的參數
BEGIN
SELECT TO_CHAR(SYSDATE - 1,''YYYY-MM-DD'') INTO V_RQ FROM DUAL;
存儲過租沒程名稱團早(V_RQ, V_FLG);
IF V_FLG <> ''1'' THEN
RAISE_APPLICATION_ERROR(-20001,V_FLG);
END IF;
END;',
repeat_interval => 'FREQ=DAILY;BYHOUR=1;BYMINUTE=0;BYSECOND=0',
start_date => to_timestamp_tz('2011-08-04 +18:00', 'YYYY-MM-DD TZH:TZM'),
job_class => 'DEFAULT_JOB_CLASS',
comments => 'JOB描述信息',
auto_drop =>塌型雀 FALSE,
enabled => TRUE);
END;
這是JOB的一個例子,我對一些具體名稱進行了注釋,如果日期需要靈活的可以動態作為參數傳遞執行的日期。