创建包名:

 CREATE OR REPLACE PACKAGE BODY PKG_UTILITY AS

   --字符串转换到索引表
PROCEDURE STR_TO_LIST(PI_STR IN VARCHAR2, --字符串
PO_LIST OUT VC2000_TABLE, --索引表
PO_NUM OUT NUMBER, --单元数
PI_DELIMITER IN VARCHAR2 DEFAULT PARAM_INSIDE_DELIMITER --分隔符
) IS
V_STR VARCHAR2(32767);
V_UNIT VARCHAR2(32767);
V_LIST VC2000_TABLE;
V_NUM NUMBER;
BEGIN
V_STR := PI_STR;
IF (SUBSTR(V_STR, LENGTH(V_STR) - LENGTH(PI_DELIMITER) + 1)CREATE OR REPLACE PACKAGE pkg_utility AS TYPE vc2000_table IS TABLE OF VARCHAR2(32767) INDEX BY VARCHAR2(32767);
--定义常量的方法
--定义常量的语法格式 常量名 constant 类型标识符 [not null]:=值;
--declare
-- pi constant number(9):=3.1415926;
-- begin
-- commit;
-- end;
param_inside_delimiter CONSTANT VARCHAR2(1) := CHR(3); --SQL类型
TYPE rec_sql IS RECORD(
sqltext varchar2(2000), --要执行的SQL语句
sqltype varchar2(6) , --要执行的SQL语句类型(U,I)
tname varchar2(50) --要执行的数据库表名
);
TYPE sql_tab IS TABLE OF rec_sql INDEX BY VARCHAR2(32767); --字符串转换到索引表
PROCEDURE str_to_list(
pi_str IN VARCHAR2, --字符串
po_list OUT vc2000_table, --索引表
po_num OUT NUMBER, --单元数
pi_delimiter IN VARCHAR2 DEFAULT param_inside_delimiter --分隔符
); --字符串转换到索引表 dengyongbiao 20040412
PROCEDURE str_to_namevalue(
pi_str IN VARCHAR2, --字符串
pi_name_str IN VARCHAR2, --名称串,同时也是返回列表的索引串(全部转换为大写)
po_list OUT vc2000_table, --索引表,使用索引串中的字符串作为索引,而不是单元数
pi_delimiter IN VARCHAR2 DEFAULT param_inside_delimiter, --分隔符,字符串和索引串相同
pi_name_delimiter IN VARCHAR2 default '=' -- 名称和值之间的分隔符
); FUNCTION exists_element(
pi_list IN vc2000_table,
pi_element IN VARCHAR2
) RETURN BOOLEAN; FUNCTION list_to_str(
pi_list IN vc2000_table, --索引表
pi_delimiter IN VARCHAR2 DEFAULT '|' --分隔符
)RETURN VARCHAR2; --串合并
PROCEDURE str_merge(
pi_name_str IN VARCHAR2, --名字串
pi_value_str IN VARCHAR2, --值串
po_merge_str OUT VARCHAR2, --合并串
po_fhz OUT VARCHAR2, --返回值
po_msg OUT VARCHAR2, --返回消息
pi_in_delimiter IN VARCHAR2 default CHR(3),
pi_out_delimiter IN VARCHAR2 default '='
); FUNCTION number_months(
pi_number IN NUMBER,
months IN NUMBER
)RETURN NUMBER ; --动态执行SQL语句(UPDATE和INSERT)且事务由调用者控制
PROCEDURE exec_sql(
pi_sqltab IN pkg_utility.sql_tab, --SQL语句索引表
po_fhz OUT VARCHAR2,
po_msg OUT VARCHAR2
) ; --动态执行SQL语句(UPDATE和INSERT)且
--动态语句执行及执行完成间的事务由程序控制(独立事务)
--要么动态语句全部提交成功,要么就全部不提交
PROCEDURE exec_sql_pragma(
pi_sqltab IN pkg_utility.sql_tab, --SQL语句索引表
po_fhz OUT VARCHAR2,
po_msg OUT VARCHAR2
) ; END pkg_utility;
!=
PI_DELIMITER) THEN
V_STR := PI_STR || PI_DELIMITER;
END IF; V_NUM := 0; WHILE (LENGTH(V_STR) > 1 AND V_STR IS NOT NULL) LOOP V_UNIT := SUBSTR(V_STR, 1, INSTR(V_STR, PI_DELIMITER) - 1); V_NUM := V_NUM + 1;
V_LIST(V_NUM) := V_UNIT; V_STR := SUBSTR(V_STR,
INSTR(V_STR, PI_DELIMITER) + LENGTH(PI_DELIMITER)); END LOOP; PO_LIST := V_LIST;
PO_NUM := V_NUM; END STR_TO_LIST; --字符串转换到名称值列表 dengyongbiao 20040412
PROCEDURE STR_TO_NAMEVALUE(PI_STR IN VARCHAR2, --字符串
PI_NAME_STR IN VARCHAR2, --名称串,同时也是返回列表的索引串(全部转换为大写)
PO_LIST OUT VC2000_TABLE, --索引表,使用索引串中的字符串作为索引,而不是单元数
PI_DELIMITER IN VARCHAR2 DEFAULT PARAM_INSIDE_DELIMITER, --分隔符,字符串和索引串相同
PI_NAME_DELIMITER IN VARCHAR2 DEFAULT '=' -- 名称和值之间的分隔符
) IS
V_STR VARCHAR2(32767);
V_NAME_STR VARCHAR2(32767);
V_UNIT VARCHAR2(32767);
V_INDEX_UNIT VARCHAR2(32767);
V_LIST VC2000_TABLE;
V_NAMELIST VC2000_TABLE;
V_VALUELIST VC2000_TABLE;
V_LIST_RTN VC2000_TABLE; V_NUM1 NUMBER;
V_NUM2 NUMBER;
V_NUM3 NUMBER; BEGIN
V_STR := PI_STR;
V_NAME_STR := PI_NAME_STR; STR_TO_LIST(PI_STR, V_LIST, V_NUM1, PI_DELIMITER);
STR_TO_LIST(PI_NAME_STR, V_NAMELIST, V_NUM2, PI_DELIMITER);
IF V_NUM2 > 0 THEN
FOR I IN 1 .. V_NUM2 LOOP
V_LIST_RTN(UPPER(V_NAMELIST(I))) := NULL; -- 初始化
FOR J IN 1 .. V_NUM1 LOOP
STR_TO_LIST(V_LIST(J), V_VALUELIST, V_NUM3, PI_NAME_DELIMITER);
IF V_NUM3 = 1 THEN
V_VALUELIST(2) := NULL;
END IF;
IF V_NUM3 > 0 AND UPPER(V_VALUELIST(1)) = UPPER(V_NAMELIST(I)) THEN
V_LIST_RTN(UPPER(V_NAMELIST(I))) := V_VALUELIST(2);
END IF;
END LOOP;
END LOOP;
END IF; PO_LIST := V_LIST_RTN; END STR_TO_NAMEVALUE; FUNCTION EXISTS_ELEMENT(PI_LIST IN VC2000_TABLE, PI_ELEMENT IN VARCHAR2)
RETURN BOOLEAN IS
BEGIN
IF PI_LIST.COUNT = 0 THEN
RETURN FALSE;
END IF; FOR I IN 1 .. PI_LIST.COUNT LOOP
IF PI_ELEMENT = PI_LIST(I) THEN
RETURN TRUE;
END IF;
END LOOP; RETURN FALSE;
END; FUNCTION LIST_TO_STR(PI_LIST IN VC2000_TABLE, --索引表
PI_DELIMITER IN VARCHAR2 DEFAULT '|' --分隔符
) RETURN VARCHAR2 IS
V_STR VARCHAR2(32767);
BEGIN
IF PI_LIST.COUNT = 0 THEN
RETURN NULL;
END IF; FOR I IN PI_LIST.FIRST .. PI_LIST.LAST LOOP
V_STR := V_STR || PI_LIST(I) || PI_DELIMITER;
END LOOP; V_STR := SUBSTR(V_STR, 1, LENGTH(V_STR) - LENGTH(PI_DELIMITER));
RETURN V_STR;
END; --串合并
PROCEDURE STR_MERGE(PI_NAME_STR IN VARCHAR2, --名字串
PI_VALUE_STR IN VARCHAR2, --值串
PO_MERGE_STR OUT VARCHAR2, --合并串
PO_FHZ OUT VARCHAR2, --返回值
PO_MSG OUT VARCHAR2, --返回消息
PI_IN_DELIMITER IN VARCHAR2 DEFAULT CHR(3),
PI_OUT_DELIMITER IN VARCHAR2 DEFAULT '=') IS
V_NAME_LIST VC2000_TABLE;
V_VALUE_LIST VC2000_TABLE;
V_NUM NUMBER;
BEGIN
STR_TO_LIST(PI_NAME_STR, V_NAME_LIST, V_NUM);
STR_TO_LIST(PI_VALUE_STR, V_VALUE_LIST, V_NUM); FOR I IN 1 .. V_NUM LOOP
IF I = V_NUM THEN
PO_MERGE_STR := PO_MERGE_STR || V_NAME_LIST(I) || PI_OUT_DELIMITER ||
V_VALUE_LIST(I);
ELSE
PO_MERGE_STR := PO_MERGE_STR || V_NAME_LIST(I) || PI_OUT_DELIMITER ||
V_VALUE_LIST(I) || PI_IN_DELIMITER;
END IF; END LOOP; END; FUNCTION NUMBER_MONTHS(PI_NUMBER IN NUMBER, MONTHS IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN TO_NUMBER(TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(PI_NUMBER, 1, 6),
'yyyymm'),
MONTHS),
'yyyymm'));
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,
'PKG_UTILITY.number_months_99:' || SQLERRM); END; --动态执行SQL语句(UPDATE和INSERT)且事务由调用者控制
PROCEDURE EXEC_SQL(PI_SQLTAB IN PKG_UTILITY.SQL_TAB, --索引表
PO_FHZ OUT VARCHAR2,
PO_MSG OUT VARCHAR2) IS
V_SQLTEXT VARCHAR2(3000);
V_LX_DML VARCHAR2(6);
BEGIN
FOR I IN 1 .. PI_SQLTAB.COUNT LOOP
--获取到SQL内容
V_SQLTEXT := PI_SQLTAB(I).SQLTEXT;
V_LX_DML := UPPER(SUBSTR(LTRIM(V_SQLTEXT), 1, 6));
IF V_LX_DML <> 'DELETE' AND V_LX_DML <> 'UPDATE' AND
V_LX_DML <> 'INSERT' THEN
PO_FHZ := 'pkg_utility.exec_sql_050';
PO_MSG := '传入的SQL语句不为DELETE,UPDATE,INSERT.';
RETURN;
END IF; EXECUTE IMMEDIATE V_SQLTEXT;
END LOOP;
PO_FHZ := '';
EXCEPTION
WHEN OTHERS THEN
PO_FHZ := 'pkg_utility.exec_sql_999';
PO_MSG := '调用pkg_utility.exec_sql出现系统错误.SQLCODE=' || SQLCODE ||
',SQLERRM=' || SQLERRM || ',执行语句为:' || V_SQLTEXT;
RETURN;
END EXEC_SQL; --动态执行SQL语句(UPDATE和INSERT)且
--动态语句执行及执行完成间的事务由程序控制(独立事务)
--要么动态语句全部提交成功,要么就全部不提交
PROCEDURE EXEC_SQL_PRAGMA(PI_SQLTAB IN PKG_UTILITY.SQL_TAB, --SQL语句索引表
PO_FHZ OUT VARCHAR2,
PO_MSG OUT VARCHAR2) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXEC_SQL(PI_SQLTAB, PO_FHZ, PO_MSG);
IF PO_FHZ <> '' THEN
ROLLBACK;
RETURN;
END IF;
COMMIT;
PO_FHZ := '';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
PO_FHZ := 'pkg_utility.exec_sql_pragma_999';
PO_MSG := '调用pkg_utility.exec_sql_pragma出现系统错误.SQLCODE=' || SQLCODE ||
',SQLERRM=' || SQLERRM;
RETURN;
END EXEC_SQL_PRAGMA; END PKG_UTILITY;

创建包体:

 CREATE OR REPLACE PACKAGE BODY PKG_UTILITY AS

   --字符串转换到索引表
PROCEDURE STR_TO_LIST(PI_STR IN VARCHAR2, --字符串
PO_LIST OUT VC2000_TABLE, --索引表
PO_NUM OUT NUMBER, --单元数
PI_DELIMITER IN VARCHAR2 DEFAULT PARAM_INSIDE_DELIMITER --分隔符
) IS
V_STR VARCHAR2(32767);
V_UNIT VARCHAR2(32767);
V_LIST VC2000_TABLE;
V_NUM NUMBER;
BEGIN
V_STR := PI_STR;
IF (SUBSTR(V_STR, LENGTH(V_STR) - LENGTH(PI_DELIMITER) + 1) !=
PI_DELIMITER) THEN
V_STR := PI_STR || PI_DELIMITER;
END IF; V_NUM := 0; WHILE (LENGTH(V_STR) > 1 AND V_STR IS NOT NULL) LOOP V_UNIT := SUBSTR(V_STR, 1, INSTR(V_STR, PI_DELIMITER) - 1); V_NUM := V_NUM + 1;
V_LIST(V_NUM) := V_UNIT; V_STR := SUBSTR(V_STR,
INSTR(V_STR, PI_DELIMITER) + LENGTH(PI_DELIMITER)); END LOOP; PO_LIST := V_LIST;
PO_NUM := V_NUM; END STR_TO_LIST; --字符串转换到名称值列表 dengyongbiao 20040412
PROCEDURE STR_TO_NAMEVALUE(PI_STR IN VARCHAR2, --字符串
PI_NAME_STR IN VARCHAR2, --名称串,同时也是返回列表的索引串(全部转换为大写)
PO_LIST OUT VC2000_TABLE, --索引表,使用索引串中的字符串作为索引,而不是单元数
PI_DELIMITER IN VARCHAR2 DEFAULT PARAM_INSIDE_DELIMITER, --分隔符,字符串和索引串相同
PI_NAME_DELIMITER IN VARCHAR2 DEFAULT '=' -- 名称和值之间的分隔符
) IS
V_STR VARCHAR2(32767);
V_NAME_STR VARCHAR2(32767);
V_UNIT VARCHAR2(32767);
V_INDEX_UNIT VARCHAR2(32767);
V_LIST VC2000_TABLE;
V_NAMELIST VC2000_TABLE;
V_VALUELIST VC2000_TABLE;
V_LIST_RTN VC2000_TABLE; V_NUM1 NUMBER;
V_NUM2 NUMBER;
V_NUM3 NUMBER; BEGIN
V_STR := PI_STR;
V_NAME_STR := PI_NAME_STR; STR_TO_LIST(PI_STR, V_LIST, V_NUM1, PI_DELIMITER);
STR_TO_LIST(PI_NAME_STR, V_NAMELIST, V_NUM2, PI_DELIMITER);
IF V_NUM2 > 0 THEN
FOR I IN 1 .. V_NUM2 LOOP
V_LIST_RTN(UPPER(V_NAMELIST(I))) := NULL; -- 初始化
FOR J IN 1 .. V_NUM1 LOOP
STR_TO_LIST(V_LIST(J), V_VALUELIST, V_NUM3, PI_NAME_DELIMITER);
IF V_NUM3 = 1 THEN
V_VALUELIST(2) := NULL;
END IF;
IF V_NUM3 > 0 AND UPPER(V_VALUELIST(1)) = UPPER(V_NAMELIST(I)) THEN
V_LIST_RTN(UPPER(V_NAMELIST(I))) := V_VALUELIST(2);
END IF;
END LOOP;
END LOOP;
END IF; PO_LIST := V_LIST_RTN; END STR_TO_NAMEVALUE; FUNCTION EXISTS_ELEMENT(PI_LIST IN VC2000_TABLE, PI_ELEMENT IN VARCHAR2)
RETURN BOOLEAN IS
BEGIN
IF PI_LIST.COUNT = 0 THEN
RETURN FALSE;
END IF; FOR I IN 1 .. PI_LIST.COUNT LOOP
IF PI_ELEMENT = PI_LIST(I) THEN
RETURN TRUE;
END IF;
END LOOP; RETURN FALSE;
END; FUNCTION LIST_TO_STR(PI_LIST IN VC2000_TABLE, --索引表
PI_DELIMITER IN VARCHAR2 DEFAULT '|' --分隔符
) RETURN VARCHAR2 IS
V_STR VARCHAR2(32767);
BEGIN
IF PI_LIST.COUNT = 0 THEN
RETURN NULL;
END IF; FOR I IN PI_LIST.FIRST .. PI_LIST.LAST LOOP
V_STR := V_STR || PI_LIST(I) || PI_DELIMITER;
END LOOP; V_STR := SUBSTR(V_STR, 1, LENGTH(V_STR) - LENGTH(PI_DELIMITER));
RETURN V_STR;
END; --串合并
PROCEDURE STR_MERGE(PI_NAME_STR IN VARCHAR2, --名字串
PI_VALUE_STR IN VARCHAR2, --值串
PO_MERGE_STR OUT VARCHAR2, --合并串
PO_FHZ OUT VARCHAR2, --返回值
PO_MSG OUT VARCHAR2, --返回消息
PI_IN_DELIMITER IN VARCHAR2 DEFAULT CHR(3),
PI_OUT_DELIMITER IN VARCHAR2 DEFAULT '=') IS
V_NAME_LIST VC2000_TABLE;
V_VALUE_LIST VC2000_TABLE;
V_NUM NUMBER;
BEGIN
STR_TO_LIST(PI_NAME_STR, V_NAME_LIST, V_NUM);
STR_TO_LIST(PI_VALUE_STR, V_VALUE_LIST, V_NUM); FOR I IN 1 .. V_NUM LOOP
IF I = V_NUM THEN
PO_MERGE_STR := PO_MERGE_STR || V_NAME_LIST(I) || PI_OUT_DELIMITER ||
V_VALUE_LIST(I);
ELSE
PO_MERGE_STR := PO_MERGE_STR || V_NAME_LIST(I) || PI_OUT_DELIMITER ||
V_VALUE_LIST(I) || PI_IN_DELIMITER;
END IF; END LOOP; END; FUNCTION NUMBER_MONTHS(PI_NUMBER IN NUMBER, MONTHS IN NUMBER) RETURN NUMBER IS
BEGIN
RETURN TO_NUMBER(TO_CHAR(ADD_MONTHS(TO_DATE(SUBSTR(PI_NUMBER, 1, 6),
'yyyymm'),
MONTHS),
'yyyymm'));
EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20001,
'PKG_UTILITY.number_months_99:' || SQLERRM); END; --动态执行SQL语句(UPDATE和INSERT)且事务由调用者控制
PROCEDURE EXEC_SQL(PI_SQLTAB IN PKG_UTILITY.SQL_TAB, --索引表
PO_FHZ OUT VARCHAR2,
PO_MSG OUT VARCHAR2) IS
V_SQLTEXT VARCHAR2(3000);
V_LX_DML VARCHAR2(6);
BEGIN
FOR I IN 1 .. PI_SQLTAB.COUNT LOOP
--获取到SQL内容
V_SQLTEXT := PI_SQLTAB(I).SQLTEXT;
V_LX_DML := UPPER(SUBSTR(LTRIM(V_SQLTEXT), 1, 6));
IF V_LX_DML <> 'DELETE' AND V_LX_DML <> 'UPDATE' AND
V_LX_DML <> 'INSERT' THEN
PO_FHZ := 'pkg_utility.exec_sql_050';
PO_MSG := '传入的SQL语句不为DELETE,UPDATE,INSERT.';
RETURN;
END IF; EXECUTE IMMEDIATE V_SQLTEXT;
END LOOP;
PO_FHZ := '';
EXCEPTION
WHEN OTHERS THEN
PO_FHZ := 'pkg_utility.exec_sql_999';
PO_MSG := '调用pkg_utility.exec_sql出现系统错误.SQLCODE=' || SQLCODE ||
',SQLERRM=' || SQLERRM || ',执行语句为:' || V_SQLTEXT;
RETURN;
END EXEC_SQL; --动态执行SQL语句(UPDATE和INSERT)且
--动态语句执行及执行完成间的事务由程序控制(独立事务)
--要么动态语句全部提交成功,要么就全部不提交
PROCEDURE EXEC_SQL_PRAGMA(PI_SQLTAB IN PKG_UTILITY.SQL_TAB, --SQL语句索引表
PO_FHZ OUT VARCHAR2,
PO_MSG OUT VARCHAR2) IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXEC_SQL(PI_SQLTAB, PO_FHZ, PO_MSG);
IF PO_FHZ <> '' THEN
ROLLBACK;
RETURN;
END IF;
COMMIT;
PO_FHZ := '';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
PO_FHZ := 'pkg_utility.exec_sql_pragma_999';
PO_MSG := '调用pkg_utility.exec_sql_pragma出现系统错误.SQLCODE=' || SQLCODE ||
',SQLERRM=' || SQLERRM;
RETURN;
END EXEC_SQL_PRAGMA; END PKG_UTILITY;

pkg_utility的更多相关文章

  1. xzzx

    创建包: CREATE OR REPLACE PACKAGE WYL_TEST_PKG_GGYW_XZZX IS -- Purpose : 公共业务-参保险种注销 --注销选择的险种,并将参保缴费信息 ...

随机推荐

  1. [置顶] 老孟 DB2 V9.7 ESE(一)产品部署 基于centOS 6.4

    本文安装系统CENTOS 6.4 DB2位数64 安装中涉及目录位置各位可自行定义 生产系统为安全和性能考虑,一般将DB2实例目录.日志目录.归档日志目录.表空间目录区分开,可建立/db2home / ...

  2. sqlserver 在将 nvarchar 值 'XXX' 转换成数据类型 int 时失败

    最近做oracle和sqlserver数据库兼容,感觉sqlserver真心没oracle好用,存储过程竟然只能返回int类型,疯了 疯了 存储过程的output及return的区别 sql取整 ce ...

  3. OutputDebugString 输出信息到调试器

    #include <Windows.h>#include <stdio.h>#include <stdarg.h> void __cdecl odprintf(co ...

  4. FPGA中改善时序性能的方法_advanced FPGA design

    本文内容摘自<advanced FPGA design>对应中文版是 <高级FPGA设计,结构,实现,和优化>第一章中的内容 FPGA中改善时序,我相信也是大家最关心的话题之一 ...

  5. 射频识别技术漫谈(16)——Mifare UltraLight

    Mifare UltraLight又称为MF0,从UltraLight(超轻的)这个名字就可以看出来,它是一个低成本.小容量的卡片.低成本,是指它是目前市场中价格最低的遵守ISO14443A协议的芯片 ...

  6. 用C#开发较完整的Windows任务管理器

    原文 用C#开发较完整的Windows任务管理器 这个代码没有什么技术含量,仅仅使用 WMI 和 API 实现了 Windows 任务管理器的部分功能. 但代码里面封装了一个 SystemInfo 的 ...

  7. 超轻量级PHP SQL数据库框架

    <?php /** * ! Medoo 0.8.5 - Copyright 2013, Angel Lai - MIT license - http://medoo.in */ class me ...

  8. Sicily-1443

    一.      题意: 模拟队列的操作,按优先级pop.如果有元素pop,则其他在队列里面的元素的时间都要加1.如果队头的元素因为优先级不够高而要push回队列的时候,所有元素的时间都不用改变. 二. ...

  9. Binary Tree Level Order Traversal II --leetcode C++

    考察点 广度优先遍历--层次遍历 STL内容器的用法 广度优先遍历的时候,首先应该想到的就是借助于队列.还需要在遍历下一层之前保存当前层节点的数量 代码很简单: class Solution { pu ...

  10. 关于android源码中的APP编译时引用隐藏的API出现的问题

    今天在编译android源码中的计算器APP时发现,竟然无法使用系统隐藏的API,比如android.os.ServiceManager中的API,引用这个类时提示错误,记忆中在android源码中的 ...