建立package
create or replace package pack_one as --包頭的宣告
type cur is ref cursor; --定義一個動態遊標,也只能是動態
type v_record is record( -- 定義一個記錄型別(集合的一種)
v_name emp.ename%type,
v_sal emp.sal%type,
v_dname dept.dname%type
);
function my_fun(v_job varchar2) return cur; --定義一個方法
procedure my_pro(v_job in varchar2,my_cur2 out cur);--定義一個儲存過種
end pack_one;--包頭結束
create or replace package body pack_one as--建立一個包體
function my_fun(v_job varchar2) return cur--對方法的實現,注意是在包體的宣告部分裡操作
is
my_cur cur;--宣告遊標,因為還是在包的部分,所以直接宣告即可
sql_cur varchar2(200);
begin
sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job||'''';--拼接SQL語句,重要注意引號的使用.因為job欄位是字串型。如果是numbr型別,就沒這麼費勁,海要加單引號了。
dbms_output.put_line(sql_cur);--可以透過輸出為除錯拼接好的SQL語句
open my_cur for sql_cur;--開啟遊標
return(my_cur);--方法有返回值,要牢記
end my_fun;--方法的實現結束
procedure my_pro(v_job in varchar2,my_cur2 out cur)--對儲存過程的實現
as
sql_cur varchar2(200);
begin
sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job|| '''';
open my_cur2 for sql_cur;--開啟遊標,注意,開啟的是傳進來的引數,即我們把遊標透過引數傳出給呼叫環境 因為是out
end my_pro;
begin
null;
end pack_one;--儲存實現的結束
使用using 改寫上述過程(包體不部分):
create or replace package body pack_one asfunction my_fun(v_job varchar2) return cur is
my_cur cur sql_cur varchar2(200);
begin
sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job= :job';
--使用繫結變數時,即使是字串型別,也不需要格外加單引號, 繫結變數自身含有型別,透過下面的using v_job就給繫結變數賦予了合適的型別,此處千萬不要畫蛇添足,否則回報錯。這點與字串拼接是不同的。
dbms_output.put_line(sql_cur);
open my_cur for sql_cur using v_job;
return(my_cur);--方法有返回值,要牢記
end my_fun;--方法的實現結束
procedure my_pro(v_job in varchar2,my_cur2 out cur)--對儲存過程的實現
as
sql_cur varchar2(200);
begin
sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job= :job'; --使用繫結變數時,即使是字串型別,也不需要格外加單引號, 繫結變數自身含有型別,透過下面的using v_job就給繫結變數賦予了合適的型別,此處千萬不要畫蛇添足,否則回報錯。這點與字串拼接是不同的。
open my_cur2 for sql_cur using v_job;
end my_pro;
begin
null;
end pack_one;--儲存實現的結束
declare--下面是對包的呼叫 呼叫其中的方法
v_cur pack_one.cur;--注意這裡遊標型別宣告的方式
my_record pack_one.v_record;--同上,注意宣告方式
begin
v_cur:=pack_one.my_fun('CLERK');--透過引數調過方法,傳進的引數,會被接收 因為是in
loop
fetch v_cur into my_record;
exit when v_cur%notfound;
dbms_output.put_line(my_record.v_name||'--'||my_record.v_sal||'--'||my_record.v_dname);
end loop;
end;
declare --下面是對包的呼叫,呼叫其中的合儲存過程
temp_record pack_one.v_record;--同上,注意宣告方式
my_cur2 pack_one.cur;--注意這裡遊標型別宣告的方式
begin
pack_one.my_pro('CLERK',my_cur2);--透過傳參,來呼叫,第一個引數是傳進,第二個是用於接收傳出的引數
loop
fetch my_cur2 into temp_record;
exit when my_cur2%notfound;
dbms_output.put_line(temp_record.v_name||'--'||temp_record.v_sal||'--'||temp_record.v_dname);
end loop;
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27042095/viewspace-739583/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- dart系列之:建立Library packageDartPackage
- not an rpm package (or package manifest):Package
- not an rpm package (or package manifest)Package
- packagePackage
- Package Specification 和 Package Body 及 Package有什麼區別? (轉)Package
- 深入安卓Package Manager和Package Installer安卓Package
- 建立Android專案時Package name應該咋填?有限制嗎?AndroidPackage
- Package ssh is not available, but is referred to by another package 錯誤PackageAI
- ORA-04042 procedure, function, package, or package body does not existFunctionPackage
- java 包(package)JavaPackage
- alter package/procedurePackage
- Package and ClassPath (轉)Package
- flutter package get 卡FlutterPackage
- Go package time 用法GoPackage
- yum error - package is a duplicate withErrorPackage
- package.jsonPackageJSON
- The DBMS_System PackagePackage
- utl_mail packageAIPackage
- Oracle 基礎 ----packageOraclePackage
- Rust Package Manager:CargoRustPackageCargo
- java中不帶package和帶package的編譯執行方式JavaPackage編譯
- 包頭(Package)與包體(Package body)的學習與應用Package
- Laravel Package 中文文件LaravelPackage
- Android APIs (Package Index)AndroidAPIPackageIndex
- Go package(1) time 用法GoPackage
- github package的使用教程GithubPackage
- PL/SQL 09 包 packageSQLPackage
- create a nodejs npm packageNodeJSNPMPackage
- SSIS Package 命名規則Package
- deploy package outside of jbossPackageIDE
- Java_util_package(轉)JavaPackage
- 在OpenWrt中新增packagePackage
- 如何處理Eclipse錯誤訊息 The declared package does not match the expected packageEclipsePackage
- package.json詳解PackageJSON
- package.json 詳解PackageJSON
- golang package time 用法詳解GolangPackage
- package.json 入門PackageJSON
- Vagrant package 打包 Homestead boxPackage