今天是自己第一次系统的写PL/SQL包(函数,存储过程,包主体),自己总结了一下编写中出现的错误。
函数:
参数:变量名称 in out vachar2|int|
后面直接:return varchar2|int类型 ,不需要长度
使用变量 ,直接使用,不需要单引号和双引号
存储过程:
执行存储过程语法:begin ex.imp;end;
包:
包的接口中定义函数和存储过程,如果函数有返回值,要在函数后面加“return varchar2”返回类型。同时要在包接口中用注释,包主体是不能使用的,
包中的函数可以不使用包.函数调用,直接调用就可以。
包接口 package e is ....end e; 要注意有“;” ,同时包主体里,不能使用“create or replace "字样
自己写的包的接口:
PL/SQL
CREATE OR REPLACE
PACKAGE execImp
IS
/*
* 该表为导入数据的目的表
* 查询从PD中生成的表机构数据,数据表的名称和列名为没有双引号
* 如表名为:label,但在user_tab_cols表中存储的表名为大写
* 2008年10月16日15:42:40 by zping
*/
FUNCTION getTargetCols
(
tbname IN VARCHAR2)
RETURN VARCHAR2;
/*
* 该表为到入数据的数据来源表
* 查询指定表的全部列名,指定表为从SQL SERVER 2005的DTS导入的表
* 导入的表名称有双引号号 如: "label",在user_tab_cols中存储的数据为小写。
* 2008年10月16日15:42:40 by zping
*/
FUNCTION getSourceCols
(
tbname IN VARCHAR2)
RETURN VARCHAR2;
/*
* 对于单个表生成插入数据的SQL
* 2008年10月16日15:42:40 by zping
*/
FUNCTION getExecSQL
(
tbname IN VARCHAR2)
RETURN VARCHAR2;
/*
* 数据中两个表互相导入数据。
* 2008年10月16日15:42:40 by zping
*/
PROCEDURE execImpData;
END execImp;
自己写的包主体
PL/SQL
create or replace PACKAGE body execImp
AS
FUNCTION getSourceCols
(
tbname IN VARCHAR2)
RETURN VARCHAR2
IS
v_cols VARCHAR2(4000);
BEGIN
FOR x IN
(SELECT * FROM user_tab_cols WHERE table_name=lower(tbname)
)
LOOP
v_cols:=v_cols||','||'"'||x.column_name||'"';
END LOOP;
v_cols:= SUBSTR(v_cols, 2, LENGTH(v_cols));
RETURN v_cols;
END;
FUNCTION getTargetCols
(
tbname IN VARCHAR2)
RETURN VARCHAR2
AS
v_SQL VARCHAR2(4000);
BEGIN
FOR x IN
(SELECT * FROM user_tab_cols WHERE table_name= upper(tbname)
)
LOOP
v_SQL:=v_SQL||','||x.column_name;
END LOOP;
v_sql:= SUBSTR(v_sql,2,LENGTH(v_sql));
RETURN v_sql;
END;
PROCEDURE execImpData
AS
v_sql VARCHAR2(4000);
BEGIN
FOR x IN
(SELECT * FROM Ttemp
)
LOOP
v_sql:=getExecSQL(x.tbname);
EXECUTE immediate v_sql;
END LOOP;
COMMIT;
END;
FUNCTION getExecSQL
(
tbname IN VARCHAR2)
RETURN VARCHAR2
AS
v_sql VARCHAR2(4000);
BEGIN
v_sql:='insert into '|| tbname||'('||getTargetCols(tbname)||') ';
v_sql:=v_sql||' select '||getSourceCols(tbname)||' from '||'"'||tbname||'"';
RETURN v_sql;
END;
END execImp;