lightdb對oracle package的兼容性還是不錯的,大部分都已經支持。如下:
-- 創建oracle模式數據庫 zjh@postgres=# create database ora_db3 lightdb_syntax_compatible_typE=oracle; NOTICE: auto create user "ora_db3" success CREATE DATABASE \c ora_db3 --刪除表 drop table appl_application_sbfp; drop table sys_user_info; --創建表和主鍵 CREATE TABLE appl_application_sbfp ( application_no varchar(32) NOT NULL , customer_id varchar(32) NOT NULL, customer_name varchar(32) NOT NULL, input_user_id varchar(32) NOT NULL, PRIMARY KEY (application_no) ); CREATE TABLE sys_user_info ( user_id varchar(32) NOT NULL , user_name varchar(32) NOT NULL, pass_word varchar(32),--default null org_id varchar(32), PRIMARY KEY (user_id) ); insert into appl_application_sbfp(application_no,customer_id,customer_name,input_user_id) values('APPL20190603','c20190603','王平','WANGLI'); insert into appl_application_sbfp(application_no,customer_id,customer_name,input_user_id) values('APPL20190604','c20190604','張平','WANGLI'); insert into sys_user_info(user_id,user_name) values('WANGLI','王麗'); -- 創建包、包體、存儲函數 drop package body PA_GLOBAL; drop package PA_GLOBAL; create or replace package PA_GLOBAL is FUNCTION getUserName(user_id IN varchar2) RETURN varchar2; end PA_GLOBAL; / create or replace package body PA_GLOBAL is FUNCTION getUserName(user_id IN varchar2) RETURN varchar2 is userName varchar2(200); BEGIN SELECT user_name into userName from sys_user_info; return userName; END getUserName; BEGIN dbms_output.put_line('Control is now executing the package initialization part'); -- package初始化塊必須在最後 end PA_GLOBAL; /
begin perform PA_GLOBAL.getUserName('abc'); end; /
package級別變量--存儲在lt_variable中
CREATE OR REPLACE PACKAGE my_globals IS g_fav_language VARCHAR2 (6) := 'PL/SQL'; PROCEDURE show_fav_languages; END; / CREATE OR REPLACE PACKAGE BODY my_globals IS PROCEDURE show_fav_languages IS l_fav_language VARCHAR2 (6) := 'SQL'; BEGIN DBMS_OUTPUT.put_line ('* Local favorite language ' || l_fav_language); DBMS_OUTPUT.put_line ( '* Global favorite language ' || my_globals.g_fav_language); END; END; /
BEGIN DBMS_OUTPUT.PUT_LINE ('Initial values'); my_globals.show_fav_languages; DBMS_OUTPUT.PUT_LINE ('Global value changed'); my_globals.g_fav_language := 'SQL'; my_globals.show_fav_languages; END; / * Local favorite language SQL * Global favorite language PL/SQL * Local favorite language SQL * Global favorite language SQL DO zjh@ora_db=# BEGIN my_globals.show_fav_languages; my_globals.g_fav_language := 'SQL'; my_globals.show_fav_languages; END; / * Local favorite language SQL * Global favorite language SQL * Local favorite language SQL * Global favorite language SQL DO
包級全局變量是靜態變量,不是實例變量。
package級別遊標和%rowtype
CREATE TABLE test(x INT, y VARCHAR2(100)); create table rectype(a int,b varchar2(100)); INSERT INTO test VALUES (1, 'One'); INSERT INTO test VALUES (2, 'Two'); INSERT INTO test VALUES (3, 'Three'); CREATE OR REPLACE PACKAGE example AS -- Declare type, cursor: CURSOR curtype RETURN rectype%rowtype; rec rectype%rowtype; -- Declare subprograms: FUNCTION somefunc (v int) RETURN NUMBER; -- Overload preceding subprogram: PROCEDURE xfunc (emp_id NUMBER); PROCEDURE xfunc (emp_email VARCHAR2); END; / CREATE OR REPLACE PACKAGE BODY example AS nelems NUMBER; -- variable in this package -- Define cursor declared in package specification: CURSOR curtype RETURN rectype%rowtype IS SELECT x, y FROM test ORDER BY x; -- Define subprograms declared in package specification: FUNCTION somefunc (v int) RETURN NUMBER IS id NUMBER := 0; BEGIN OPEN curtype; FETCH curtype INTO rec; close curtype; RETURN rec.a; END; PROCEDURE xfunc (emp_id NUMBER) IS BEGIN NULL; END; PROCEDURE xfunc (emp_email VARCHAR2) IS BEGIN NULL; END; END; / select example.somefunc(1); somefunc ---------- 1 (1 row)
package級別自定義類型--23.3開始支持出參爲關聯數組類型和create type xxx is/as object
zjh@ora_db2=# zjh@ora_db2=# CREATE OR REPLACE PACKAGE EMP_PKG zjh@ora_db2-# IS zjh@ora_db2$# TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER; -- binary_integer爲lightdb不支持類型 zjh@ora_db2$# zjh@ora_db2$# PROCEDURE read_emp_table (p_emp_table OUT emp_table_type); zjh@ora_db2$# END EMP_PKG; zjh@ora_db2$# / ERROR: unsupported table index type zjh@ora_db2=# CREATE OR REPLACE PACKAGE EMP_PKG IS TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY INTEGER; PROCEDURE read_emp_table (p_emp_table OUT emp_table_type); END EMP_PKG; / ERROR: SQL function cannot accept associative arrays type "emp_table_type" -- 23.2之前的版本不支持關聯數組作爲參數
1.返回類型爲pipelined table。 create or REPLACE type dept_obj is OBJECT( DEPTNO NUMBER(2,0), DNAME VARCHAR2(14 BYTE) ); -- is object從23.3開始支持 create or REPLACE type dept_obj_type AS table of dept_obj; 2.定義package 和package body。 create or replace package SPTest is /*return a pipelined demo start*/ type dept_data_rec_type is RECORD( DEPTNO NUMBER(2,0), DNAME VARCHAR2(14) ); type dept_ref_type is REF CURSOR; function getDept(in_loc IN VARCHAR2) return dept_obj_type pipelined; /*return a pipelined demo end*/ /*return a cursor demo start*/ FUNCTION getDeptInfo(in_deptno IN dept.deptno%TYPE) RETURN dept_ref_type; /*return a cursor demo end*/ /* return a varchar value start */ function getName(in_deptno in number) RETURN VARCHAR2; /* return a varchar value end */ end SPTest; / ----------------------------------------------------------------------------------------------- create or replace package body SPTest is /*return a pipelined demo start*/ function getDept(in_loc IN VARCHAR2) return dept_obj_type pipelined is l_dept_obj dept_obj :=dept_obj(null, null); dept_ref_type_cursor dept_ref_type; dept_data_rec dept_data_rec_type; begin open dept_ref_type_cursor for select deptno, dname from dept where loc = in_loc; loop fetch dept_ref_type_cursor into dept_data_rec; exit when dept_ref_type_cursor%NOTFOUND; l_dept_obj.DEPTNO := dept_data_rec.DEPTNO; l_dept_obj.DNAME := dept_data_rec.DNAME; pipe row(l_dept_obj); end loop; close dept_ref_type_cursor; RETURN ; end getDept; /*return a pipelined demo end*/ /*return a cursor demo start*/ FUNCTION getDeptInfo(in_deptno IN dept.deptno%TYPE) RETURN dept_ref_type AS dept_ref_type_cursor dept_ref_type; BEGIN OPEN dept_ref_type_cursor FOR SELECT deptno, dname, loc FROM dept where deptno = in_deptno; RETURN dept_ref_type_cursor; END getDeptInfo; /*return a cursor demo end*/ /* return a varchar value start */ function getName(in_deptno in number) RETURN VARCHAR2 as rtn_deptname VARCHAR2(100); begin select dname into rtn_deptname from dept where deptno = in_deptno; RETURN rtn_deptname; end getName; /* return a varchar value start */ end SPTest; / 最後,執行存儲過程。 /*返回pipelined table */ select deptno, dname from table(SPTest.getDept('NEW YORK')) order by deptno; /*返回cursor*/ select SPTest.getDeptInfo(10) from dual; /*返回具體值*/ select SPTest.getName(50) from dual;
http://www.dba-oracle.com/plsql/t_plsql_global_data.htm
http://www.light-pg.com/docs/lightdb/13.8-23.2/plorasql-packages.html lightdb還支持包級遊標、類型。