Oracle 编写PL/SQL语句导入数据语句问题总结
  biE3E3UjTjeg 2024年01月22日 10 0

    今天是自己第一次系统的写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;


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年01月22日 0

暂无评论

推荐阅读
biE3E3UjTjeg