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,可是存儲過程能夠有,由於函數要有一個返回值,而存儲過程沒有。對象