日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle 原理: 过程和函数

發(fā)布時(shí)間:2024/10/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle 原理: 过程和函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

一、存儲(chǔ)過程

PL/SQL分為三個(gè)部分,聲明部分、可執(zhí)行部分、異常處理部分,其中可執(zhí)行部分是必須要有的。

創(chuàng)建過程的語法:

Create [or replace]? procedure 過程名? [(參數(shù)list)]As|Is --聲明變量在這里寫 BEGIN --過程程序在這里寫 EXCEPTION --異常處理在這里寫 END;

PL/SQL 子程序有點(diǎn):

模塊化:將程序分解為邏輯模塊

可重用性:可以被任意數(shù)目的程序使用

可維護(hù)性:簡(jiǎn)化維護(hù)操作

安全性:通過權(quán)限設(shè)置,是數(shù)據(jù)更加安全

?

create or replace procedure insertBlob(ifilepath in varchar2,ifilename in varchar2 ) authid current_user isimg_file bfile;img_blob blob;lob_length number;sqlcommand varchar2(500); isexit number; begin----動(dòng)態(tài)SQL,需要相應(yīng)權(quán)限 create table read,write on directory等 -----設(shè)置虛擬路徑sqlcommand :='create or replace directory PHOTOPATH as ''' ||ifilepath ||'''' ;dbms_output.put_line(ifilepath || ifilename);execute immediate sqlcommand;--獲取bfile文件img_file := bfilename('PHOTOPATH',ifilename);--打開文件dbms_lob.open(img_file);--獲取文件長(zhǎng)度lob_length := dbms_lob.getlength(img_file);--判斷文件是否存在,先把blob設(shè)成empty_blob()select count(1) into isexit from file_lobtest t1 where t1.filepath = ifilepath;dbms_output.put_line('isexit'|| isexit);if isexit = 0 then insert into file_lobtest values(ifilepath,null,empty_blob(),img_file);dbms_output.put_line('-------1');else update file_lobtest t1 set bfile_content=img_file,blob_content=empty_blob() where t1.filepath = ifilepath;dbms_output.put_line('-------2');end if ;--然后賦值blob變量select blob_content into img_blob from file_lobtest t1 where t1.filepath = ifilepath;--加載blobdbms_lob.loadfromfile(img_blob,img_file,lob_length);--關(guān)閉文件dbms_lob.close(img_file);commit; end;

存儲(chǔ)過程和 PL/SQL語法很接近。 存儲(chǔ)過程和函數(shù)的區(qū)別就是存儲(chǔ)過程不需要return ,可以通過out來返回多個(gè)值,而函數(shù)需要return 。存儲(chǔ)過程 要在過程語句中才能被調(diào)用,而函數(shù)可以在過程語句中調(diào)用也可以在SQL語句中被調(diào)用。

create or replace procedure coutP(i in number,ret out varchar2) authid current_user as a varchar2(50); begina :='';ret :='';for j in 1..i loopa := a|| '*';ret := ret||a||chr(10);end loop;end; / --------調(diào)用存儲(chǔ)過程------- declare arg1 varchar(100); begincoutP(5,arg1);dbms_output.put_line(arg1); end;

輸出結(jié)果:

二、函數(shù)寫法和過程差不多,只不過函數(shù)需要return 不能out,函數(shù)可以在過程語句中調(diào)用也可以在SQL語句中被調(diào)用。

create or replace function coutP_fun(i number) return varchar2 authid current_user as a varchar2(50);ret varchar2(50); begina :='';ret :='';for j in 1..i loopa := a|| '*';ret := ret||a||chr(10);end loop;return ret; end; / -----調(diào)用函數(shù)----select coutP_fun(6) from dual;

輸出結(jié)果:

?

三、自主事物處理

當(dāng)調(diào)用過程時(shí),子過程如果發(fā)生回滾則會(huì)影響到,調(diào)用過程的最終結(jié)果:要想避免子過程的事物影響到父過程,需要在子過程中添加:PRAGMA AUTONOMOUS_TRANSACTION;? --寫在? is 和 begin 之間

create or replace procedure proc(i in number,ret out varchar2) authid current_user as a varchar2(50);--PRAGMA AUTONOMOUS_TRANSACTION; beginupdate salary_tbl s set s.salary=-100 where s.employer_nm='雇傭者2'; a :='';ret :='';for j in 1..i loopa := a|| '*';ret := ret||a||chr(10);end loop;rollback; end; / declare arg1 varchar(100); beginupdate salary_tbl s set s.salary=-1200 where s.employer_nm='雇傭者1'; proc(5,arg1);dbms_output.put_line(arg1);commit; end; / select * from salary_tbl where employer_nm in('雇傭者1','雇傭者2');

把PRAGMA AUTONOMOUS_TRANSACTION;注釋掉的結(jié)果就是數(shù)據(jù)保留了原樣,因?yàn)閜roc的回滾不僅把?update salary_tbl s set s.salary=-100 where s.employer_nm='雇傭者1'; 而且把父程序的?update salary_tbl s set s.salary=-1200 where s.employer_nm='雇傭者1'; 也回滾掉了;

output結(jié)果:? ?select 的結(jié)果? 保留了原樣。

把PRAGMA AUTONOMOUS_TRANSACTION;注釋打開后的結(jié)果

在自主事物處理中:主程序按順序執(zhí)行,當(dāng)執(zhí)行到自主事物的子程序時(shí),主程序事物暫停,對(duì)應(yīng)的數(shù)據(jù)上鎖,子程序的事物開啟順序執(zhí)行子程序,子程序執(zhí)行完后,主程序繼續(xù)執(zhí)行。

自主事物處理特征: 1)與主事物處理的狀態(tài)無關(guān) ;2) 提交或回滾都不影響主事物;3)自主事物處理的結(jié)果是對(duì)其他事物是可見的;4)能夠啟動(dòng)其他自主事物處理

總結(jié)

以上是生活随笔為你收集整理的Oracle 原理: 过程和函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。