j_param                     json;
  jl_keys                     json_list;

 -- 创建json对象j_param
  j_param := json(p_in_str);
-- 校验param域是否缺少必填参数
  jl_keys := json_list('["userId","queryId", "tCardNo","cardNo","cardPwd"]');
if false = json_util_extra.containKeys(j_param, jl_keys) then
    p_out_str := '{"resultCode":"30", "resultMsg":"param域Json缺少必填参数"}';
    return;
  end if;

创建package

create or replace package json_util_extra is
  function containKeys(p_v1  json,
                       p_v2  json_list,
                       exact boolean default false) return boolean;

  function containEmptyValues(p_v1  json,
                              p_v2  json_list,
                              exact boolean default false) return boolean;
end json_util_extra;

创建 package body

create or replace package body json_util_extra is
  function containKeys(p_v1 json, p_v2 json_list, exact boolean)
    return boolean as
  begin

    for i in 1 .. p_v2.count loop
      if (not p_v1.exist(p_v2.get(i).get_string)) then
        return false;
      end if;
    end loop;

    return true;
  end;

  function containEmptyValues(p_v1 json, p_v2 json_list, exact boolean)
    return boolean as
    v_key varchar2(1024);
  begin

    for i in 1 .. p_v2.count loop
      v_key := p_v2.get(i).get_string;

      if (not p_v1.exist(v_key)) then
        return false;
      end if;

      if (p_v1.get(v_key).value_of is null) then
        return false;
      end if;
    end loop;

    return true;
  end;

begin
  -- Initialization
  null;
end json_util_extra;
-- 获取字符串类型
 json_ext.get_string(j_param, 'queryId');
-- 获取数字类型
 json_ext.get_number(j_param, 'userId');    
-- 生成标准md5
CREATE OR REPLACE FUNCTION MD5(V_INPUT_STRING IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN LOWER(UTL_RAW.CAST_TO_RAW(DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING => V_INPUT_STRING)));
  END MD5;
-- select md5(1) from dual
v_sqltext := 'select e.card_type as "cardType",
                        case
                          when e.card_type=to_char(''100'') then to_char(''获得卡片'')
                          when e.card_type=to_char(''101'') then to_char(''购买'')
                          when e.card_type=to_char(''102'') then to_char(''查看卡密'')
                          when e.card_type=to_char(''103'') then to_char(''解绑'')
                          when e.card_type=to_char(''104'') then to_char(''送出'')
                          when e.card_type=to_char(''105'') then to_char(''取消赠送'')
                          when e.card_type=to_char(''106'') then to_char(''赠送退回'')
                          when e.card_type=to_char(''107'') then to_char(''获赠'')
                          when e.card_type=to_char(''108'') then to_char(''解绑找回'')
                          when e.card_type=to_char(''109'') then to_char(''提货申请'')
                          else to_char(''其它'') end "cardTypeName",
                          e.mark as "mark",
                        to_char(e.opt_date,''yyyy-mm-dd hh24:mi:ss'') as "optDate"
                from (select d.*, rownum as rn
                      from (select ubcl.card_type,ubcl.mark,ubcl.opt_date
                            from xshe_user_band_card_log ubcl
                            where ubcl.user_id =' || v_user_id || '
                                 and ubcl.card_no =''' ||v_card_no ||'''
                                 and ubcl.status = 1 order by ubcl.opt_date asc,ubcl.id asc
                            ) d
                      where rownum <= ' || v_end_rownum || ') e
                 where rn > ' || v_begin_rownum;
                   -- update  huzhiyang 2019-10-14 10:38:47 ,卡号为字符串
   -- 执行SQL语句并返回josn_list数据
  jl_card_list := json_dyn.executeList(v_sqltext);
-- 拼接字符串时注意引号数量
-- 拼接json
p_out_str := '{"resultCode":"' || v_ret ||
                '", "resultMsg":"' || v_des ||
                '","page":"' || v_page ||
               '","pageSize":"' || v_page_size ||
               '","totalPage":"' ||v_total_page ||
               '","totalCount":"' ||v_total_count ||
               '",' || v_single_info || '}'; 
-- 打印输出错误信息
 DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode);
 DBMS_OUTPUT.put_line('sqlerrm : ' ||sqlerrm);
-- 创建数组
type card_no_tab is table of varchar2(2000) index by BINARY_INTEGER;
  v_card_no_tab_info card_no_tab;

 v_card_no_tab_info(vv_count) := '{"cardNo":"' || r.cardNo ||
                                    '","background":"' ||r.background || '"}';
for k in 1 .. vv_count loop
    if k < vv_count then
      v_single_info := v_single_info || v_card_no_tab_info(k) || ',';
    else
      v_single_info := v_single_info || v_card_no_tab_info(k);
    end if;
  end loop;
02-12 21:55