當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 存儲配置 » oracle簡單存儲過程

oracle簡單存儲過程-九游会j9娱乐平台

發布時間: 2024-02-09 08:05:23

❶ oracle 的存儲過程怎麼寫。

oracle 存儲過程的基本語法

1.基本結構
create or replace procedure 存儲過程名字
(
參數1 in number,
參數2 in number
) is
變數1 integer :=0;
變數2 date;
begin

end 存儲過程名字

2.select into statement
將select查詢的結果存入到變數中,可以同時將多個列存儲多個變數中,必須有一條
記錄,否則拋出異常(如果沒有記錄拋出no_data_found)
例子:
begin
select col1,col2 into 變數1,變數2 from typestruct where xxx;
exception
when no_data_found then
xxxx;
end;
...

3.if 判斷
if v_test=1 then
begin
do something
end;
end if;

4.while 循環
while v_test=1 loop
begin
xxxx
end;
end loop;

5.變數賦值
v_test := 123;

6.用for in 使用cursor
...
is
cursor cur is select * from xxx;
begin
for cur_result in cur loop
begin
v_sum :=cur_result.列名1 cur_result.列名2
end;
end loop;
end;

7.帶參數的cursor
cursor c_user(c_id number) is select name from user where typeid=c_id;
open c_user(變數值);
loop
fetch c_user into v_name;
exit fetch c_user%notfound;
do something
end loop;
close c_user;

8.用pl/sql developer debug
連接資料庫後建立一個test window
在窗口輸入調用sp的代碼,f9開始debug,ctrl n單步調試

❷ oracle中的存儲過程怎麼寫

oracle存儲過程寫法實例

總結項目中寫的存儲過程例子:
oracle存儲過程基本語法 存儲過程
1 create or replace procedure 存儲過程名
2 is/as
3 begin
4 null;
5 exceiption;
6 end;

1、創建存儲過程,後面可用is或者as:
create or replace procere pro_complain_template as

2、定義變數,此處用到了%type和%rowtype,參考 /database/201211/168564.html ,另外定義了一個游標,tem_instance template_cur%rowtype這個類型定義必須要在游標定義之後:
need_do_for_zl integer;
current_max_id memo_templet.templet_id%type;
cursor template_cur is select templet_name, templet_content from sys_complaint_templet;
tem_instance template_cur%rowtype;
3、begin開始塊:
begin

4、該插入語句使用了dblink,還有使用dbms_output.put_line('列印信息')進行信息輸出:
insert into memo_templet (templet_id, templet_content, templet_type, templet_memo) (select * from memo_templet@company);

select count(*) into need_do_for_zl from sys_complaint_templet;
if(need_do_for_zl > 0) then
dbms_output.put_line('列印信息');
select max(templet_id) 1 into current_max_id from memo_templet;
dbms_output.put_line('memo_templet最大id' || current_max_id);
for tem_instance in template_cur loop
insert into memo_templet (templet_id, templet_content,
templet_type, templet_memo) values (current_max_id,
tem_instance.templet_content, '7', null);
current_max_id := current_max_id 1;
dbms_output.put_line(tem_instance.templet_content);
end loop;
end if;
commit;
www.2cto.com
4、exception塊,使用when others then,其中用raise可顯示錯誤信息:
exception
when others then
dbms_output.put_line('sqlcode : ' ||sqlcode);
raise;
rollback;
if template_cur%isopen then
close template_cur;
end if;
dbms_output.put_line('列印信息');
end;

註:關於游標的使用,如果像本例中使用for循環去遍歷游標的話則不需要顯式的去用open/close
cursor打開和關閉游標,此處會自己處理,如果使用fetch
into的話就需要顯式開關游標,另外任意執行一個update操作,用隱式游標sql的屬性%found,%notfound,%rowcount,%isopen觀察update語句的執行情況,也可以使用來判斷游標狀態,如if
template_cur%isopen then。

❸ 一個簡單的oracle存儲過程的問題,begin和end之間具體能放那些東西

oracle存儲過程中,begin和end中存放的存儲過程的主體。

oracle存儲過程基本語法 存儲過程:

createorreplaceprocedure存儲過程名
is
begin
null;
end;

行1:

create or replace procedure 是一個sql語句通知oracle資料庫去創建一個叫做skeleton存儲過程, 如果存在就覆蓋它;

行2:

is關鍵詞表明後面將跟隨一個pl/sql體。

行3:

begin關鍵詞表明pl/sql體的開始。

行4:

null pl/sql語句表明什麼事都不做,這句不能刪去,因為pl/sql體中至少需要有一句;

行5:

end關鍵詞表明pl/sql體的結束

❹ 如何在oracle中使用java存儲過程

通常有三種方法來創建java存儲過程。

1. 使用oracle的sql語句來創建:

e.g. 使用create or replace and compile java source named "" as

後邊跟上java源程序。要求類的方法必須是public static的,才能用於存儲過程。

sql>"javademo1"
as
importjava.sql.*;
publicclassjavademo1
{
publicstaticvoidmain(string[]argv)
{
system.out.println("hello,javademo1");
}
}
/

java已創建。

sql>showerrorsjavasource"javademo1"
沒有錯誤。

sql>
as
languagejavaname'javademo1.main(java.lang.string[])';
/

過程已創建。

sql>setserveroutputon
sql>calljavademo1();

調用完成。

sql>calldbms_java.set_output(5000);

調用完成。

sql>calljavademo1();
hello,javademo1

調用完成。

sql>calljavademo1();
hello,javademo1
調用完成。

2. 使用外部class文件來裝載創建

e.g. 這里既然用到了外部文件,必然要將class文件放到oracle server的某一目錄下邊。

publicclassoraclejavaproc
{
publicstaticvoidmain(string[]argv)
{
system.out.println("it'sajavaoracleprocere.");
}
}


sql>;

授權成功。

sql>connscott/[email protected]
已連接。
sql>createorreplacedirectorytest_diras'd:/oracle';

目錄已創建。

sql>(test_dir,'oraclejavaproc.class')
2/

java已創建。

sql>'oraclejavaproc.main(java.lang.string[])';
2/

過程已創建。

sql>calltestjavaproc();

調用完成。

sql>executetestjavaproc;

pl/sql過程已成功完成。

sql>setserveroutputonsize5000
sql>calldbms_java.set_output(5000);

調用完成。

sql>executetestjavaproc;
it'sajavaoracleprocere.

3. 我推薦的一種方法,直接使用loadjava命令遠程裝載並創建。
先創建一個類, e.g.

importjava.sql.*;
importoracle.jdbc.*;

publicclassoraclejavaproc{

//addasalgradetothedatabase.
publicstaticvoidaddsalgrade(intgrade,intlosal,inthisal){

system.out.println("...");

try{
connectionconn=
drivermanager.getconnection("jdbc:default:connection:");

stringsql=
"insertintosalgrade"
"(grade,losal,hisal)"
"values(?,?,?)";
preparedstatementpstmt=conn.preparestatement(sql);
pstmt.setint(1,grade);
pstmt.setint(2,losal);
pstmt.setint(3,hisal);
pstmt.executeupdate();
pstmt.close();
}
catch(sqlexceptione){
system.err.println("error!addingsalgrade:"
e.getmessage());
}
}
}

使用loadjava命令將其裝載到伺服器端並編譯

d:eclipse3.1workspacedbtest>loadjava-uscott/[email protected]

aclejavaproc.java

arguments:'-u''scott/[email protected]'-v''-resolve''oraclejavaproc.java'

creating:sourceoraclejavaproc

loading:sourceoraclejavaproc

resolving:sourceoraclejavaproc

查詢一下狀態:

連接到:
.2.0.1.0-proction
withthepartitioning,
jserverrelease9.2.0.1.0-proction

sql>selectobject_name,object_type,statusfromuser_objectswhereobject_typelike'java%';

object_name
--------------------------------------------------------------------------------

object_typestatus
--------------------------------------------------
oraclejavaproc
javaclassvalid

oraclejavaproc
javasourcevalid

測試一下存儲過程:

sql>createorreplaceprocereadd_salgrade(idnumber,losalnumber,hisalnum
ber)aslanguagejavaname'oraclejavaproc.addsalgrade(int,int,int)';
2/

過程已創建。

sql>setserveroutputonsize2000
sql>calldbms_java.set_output(2000);

調用完成。

sql>executeadd_salgrade(6,10000,15000);
...

pl/sql過程已成功完成。

sql>select*fromsalgradewheregrade=6;

gradelosalhisal
------------------------------
61000015000

❺ oracle存儲過程基本語法

一:存儲過程

創建存儲過程,需要有create procedure或create any procedure的系統許可權   

刪除存儲過程,是過程的創建者或者擁有drop any procedure系統許可權 

修改存儲過程,則只能是過程的創建者或者擁有alter any procedure系統許可權的人

執行(或調用)存儲過程,是過程的創建者或是擁有execute any procedure系統許可權的人或是被擁有者授予execute許可權的人

1:語法

 1)創建

create[orreplace]procedure存儲過程名[(參數[in|out|inout] 數據類型...)]

{as|is}

[說明部分]

begin

可執行部分

[exception

錯誤處理部分]

end[過程名];

 說明:

   or replace 表示如果存在就覆蓋存儲過程

   參數有三種形式:in、out和in out。則默認為in。

  關鍵字as也可以寫成is,後跟過程的說明部分,可以在此定義過程的局部變數。

2)刪除存儲過程:

drop procedure 存儲過程名;

3)修改存儲過程:

      alter procedure 存儲過程名 compile; 

4)執行存儲過程

      execute 模式名.存儲過程名[(參數...)]; 

     或

       begin 

模式名.存儲過程名[(參數...)];

end;

另外:參數可以是變數、常量或表達式

 要其它用戶執行存儲過程須要給其它用戶授權

grant execute on 存儲過程名 to 用戶名

 2:參數說明

in 定義一個輸入參數變數,用於傳遞參數給存儲過程

out 定義一個輸出參數變數,用於從存儲過程獲取數據

in out 定義一個輸入、輸出參數變數,兼有以上兩者的功能

 1)參數名 in 數據類型 default 值;

          定義一個輸入參數變數,用於傳遞參數給存儲過程。

          可以是常量、有值變數或表達式

          default 關鍵字為可選項,用來設定參數的默認值。如果在調用存儲過程時不指明參數,則參數變數取默認值

          在存儲過程中,輸入變數接收主程序傳遞的值,但不能對其進行賦值。

2)參數名 out 數據類型;

          定義一個輸出參數變數,用於從存儲過程獲取數據,即變數從存儲過程中返回值給主程序。

          在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。

          在存儲過程中,參數變數只能被賦值而不能將其用於賦值,而且必須給輸出變數至少賦值一次。

3)參數名 in out 數據類型 default 值; 

          定義一個輸入、輸出參數變數,兼有以上兩者的功能。

          在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。

          default 關鍵字為可選項,用來設定參數的默認值。

          在存儲過程中,變數接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變數至少賦值一次。

補充:如果省略in、out或in out,則默認模式是in。 

          調用它時參數個數與位置可以不一致,用以下形式調用:

execute change_salary(p_raise=>80,p_empno=>7788);  //=>運算符左側是參數名,右側是參數表達式

 二:函數

創建函數,需要有create procedure或create any procedure的系統許可權

刪除函數,需要是函數的創建者或者是擁有drop any procedure系統許可權的人

修改函數,需要是函數的創建者或者擁有alter any procedure系統許可權的人

執行函數,需要是函數的創建者或擁有execute any procedure系統許可權的人

1:語法

1)創建:

create[orreplace]function函數名[(參數[in] 數據類型...)]

return數據類型

{as|is}

[說明部分]

begin

可執行部分

return(表達式)

[exception

    錯誤處理部分]

end[函數名];

 說明:

     參數是可選的,但只能是in類型(in關鍵字可以省略)。

     在定義部分的return 數據類型,用來表示函數的數據類型,也就是返回值的類型,不可省略。

     在可執行部分的return(表達式),用來生成函數的返回值,其表達式的類型應該和定義部分說明的函數返回值的數據類型一致。在函數的執行部分可以有多個return語句,但只有一個return語句會被執行,一旦執行了return語句,則函數結束並返回調用環境。 

2)刪除

      drop function 函數名;

3)修改

      alter procedure 函數名 compile;

4)執行

      變數名:=函數名(...) 

三:對存儲過程 和 函數的查看(可以通過對數據字典【user_source】的訪問來查詢存儲過程或函數的有關信息)

 1:查詢某個存儲過程序內容

select text from user_source where name='存儲過程名';

 2:查看數據字殿

describe user_source ; //命令行中

 3:查看存儲過程的參數

describe say_hello; //後面是過程名

 4:查看發生編輯錯誤

show errors ;

 5:查詢一個存儲過程或函數是否是有效狀態(即編譯成功)

select status from user_objects where object_name='過程名';//注意大小寫

valid表示該存儲過程有效(即通過編譯),invalid表示存儲過程無效或需要重新編譯。它的狀態會改變,這與它依賴外部表(表刪除修改等操作)有關系

6:查看存儲過程與表的依賴關系

select referenced_name,referenced_type from user_dependencies where name='say_hello';

 說明

name為實體名,type為實體類型,referenced_owner為涉及到的實體擁有者賬戶,referenced_name為涉及到的實體名,referenced_type 為涉及到的實體類型。

問題:

如果一個用戶a被授予執行屬於用戶b的一個存儲過程的許可權,在用戶b的存儲過程中,訪問到用戶c的表,用戶b被授予訪問用戶c的表的許可權,但用戶a沒有被授予訪問用戶c表的許可權,那麼用戶a調用用戶b的存儲過程是失敗的還是成功的呢?答案是成功的。

熱點內容
androidapk版本號 發布:2024-02-10 00:04:16 瀏覽:990
培訓學校源碼 發布:2024-02-09 23:57:28 瀏覽:687
pythonifaandb 發布:2024-02-09 23:36:26 瀏覽:264
javarsa私鑰加密 發布:2024-02-09 23:36:17 瀏覽:239
python證書微軟認證 發布:2024-02-09 23:34:27 瀏覽:999
wlan沒有ip配置怎麼解決 發布:2024-02-09 23:24:19 瀏覽:532
javatoexe 發布:2024-02-09 22:48:53 瀏覽:418
路由器撥號賬號密碼在哪裡 發布:2024-02-09 22:29:30 瀏覽:164
ssd緩存是什麼 發布:2024-02-09 22:00:12 瀏覽:626
簡單游腳本試用破解 發布:2024-02-09 21:42:34 瀏覽:41
网站地图