SQL包類—01—介紹與使用


 

 

 

DMSQL中的包也好,類也罷,都是相似java中的類的概念。
只是,DMSQL中的包是面向過程的,沒有繼承的概念。
DMSQL中的類是面向對象的,和java中的類類似都有繼承的概念。

咱們前面學的存儲過程/函數,如今能夠經過一個包所有把他們都集合在一個包裏,而且在這個包裏還能夠定義全部存儲過程/函數會用到的全局變量。
就像是java中的一個類集合了全部的方法與成員變量。java

 

 

包的建立主要是包規範+包體。sql

create or replace package "SYSDBA"."package_1" as
    a int default 1;
    b varchar := 'bbb';
    rownumber int := 0;
    function func_incre(c in int, d in int) return int;
end package_1;


create or replace package body "SYSDBA"."package_1" as
    function func_incre(c in int, d in int) return int as
    declare 
        e int default 1;
    begin
        e := c+d+e;
        return e;
    end func_incre;
begin 
    select count(rownum) into rownumber from test ; 
end package_1;



alter package "SYSDBA"."package_1" compile;
call "package_1".func_incre(1,1);

 

 

 

 

看個錯誤實例:數據庫

 

 

緣由:函數

一、沒法解析的成員表達式表示找不到成員也就是找不到包或者函數;首先個人數據庫是大小寫敏感的,package_1加了雙引號,是小寫,而我在call package_1,funcincre()都沒有+雙引號,因此會被編譯器自動轉化爲大寫,因此找不到包和類,因此數據庫提示:沒法解析的成員表達式。
二、存儲函數中不能包含查詢,也就是說select * from test是錯誤的,雖然編譯時不會有問題,可是執行時會提示錯誤。spa

可是在上文中,使用select count(rownum) into rownumber from test;就不會報錯,爲何?由於這個sql不是查詢,而是賦值。code

不過,函數雖然不能夠用查詢sql,可是存儲過程能夠有,由於函數要有一個返回值,而存儲過程沒有。對象

相關文章
相關標籤/搜索