今天是自己第一次系统的写PL/SQL包(函数,存储过程,包主体),自己总结了一下编写中出现的错误。

       函数:

         参数:变量名称 in out vachar2|int| 

                 后面直接:return varchar2|int类型 ,不需要长度    

                 使用变量 ,直接使用,不需要单引号和双引号

        存储过程:

          执行存储过程语法:begin ex.imp;end;     

       包:

          包的接口中定义函数和存储过程,如果函数有返回值,要在函数后面加“return varchar2”返回类型。同时要在包接口中用注释,包主体是不能使用的,

          包中的函数可以不使用包.函数调用,直接调用就可以。

          包接口 package e is  ....end e; 要注意有“”  ,同时包主体里,不能使用“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;

  自己写的包主体

 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;

相关文章:

  • 2021-11-20
  • 2022-02-18
  • 2021-08-22
  • 2022-12-23
  • 2022-12-23
  • 2021-09-28
  • 2021-11-30
  • 2021-10-09
猜你喜欢
  • 2022-12-23
  • 2021-06-06
  • 2021-06-08
  • 2021-10-26
  • 2021-06-17
  • 2021-12-04
相关资源
相似解决方案