oracle apex post接口

日常记录

使用到了apex_json方式接收

复制代码
、、、1
首先,接口通过body传递过来,成功接收到, 数据格式为 JSON_OBJECT_T
l_json := JSON_OBJECT_T.parse(:body);  
这里我用参数接收到 
然后 里面是包含了 "data"
我用 继续接收到这个
l_data            := l_json.get_object('data');

、、、2
但是有个问题,如果是使用系统原始的 get_array('persons')  之类的,始终是报错 
我只能将代码转成clob格式存放到系统的参数中
V_JSON_DATA := l_data.To_Clob;

、、、3
 apex_json.parse(V_JSON_DATA);
apex_json.parse函数来解析JSON字符串

使用 apex_json.parse(V_JSON_DATA); 将 CLOB 类型的 JSON 数据解析为 APEX 的 JSON 对象。
然后,尝试使用 apex_json.get_varchar2 函数来访问解析后的 JSON 数据。
apex_json.get_varchar2 函数是线程安全的,这意味着同一时间的多个请求不会互相影响。
每个 APEX 应用程序实例(即每个用户会话)都有自己的内存空间,
因此一个会话中的 apex_json.get_varchar2 调用不会影响另一个会话中的调用。

代码

sql 复制代码
DECLARE
  l_json     JSON_OBJECT_T;
  l_data     JSON_OBJECT_T;
  
  V_JSON   JSON_OBJECT_T;
  V_DATA   JSON_OBJECT_T;
  V_JSON_DATA CLOB;
  V_VISITORS  JSON_ARRAY_T;
  V_VISITOR   JSON_OBJECT_T;

  PAR_DATA_NO NUMBER;
  PAR_EXISTS  NUMBER;

  RETURNOBJ JSON_OBJECT_T; -- 返回

  V_SQLCODE VARCHAR2(4000); -- 错误代码
  V_SQLERRM VARCHAR2(4000); -- 错误内容

BEGIN
  
  l_json := JSON_OBJECT_T.parse(:body);

  -- 获取嵌套的data对象
  l_data            := l_json.get_object('data');

  V_JSON_DATA := l_data.To_Clob;

  apex_json.parse(V_JSON_DATA);

  -- 当前流程标题是否存在
  SELECT COUNT(*)
    INTO PAR_EXISTS
    FROM TZ_FREE_TICKETS
   WHERE PROCESS_TITLE = apex_json.get_varchar2('process_title')
     AND DEL_FLAG = 1;

  IF PAR_EXISTS > 0 THEN
  
    -- 获取原有批次号  
    SELECT DATA_NO
      INTO PAR_DATA_NO
      FROM TZ_FREE_TICKETS
     WHERE PROCESS_TITLE = apex_json.get_varchar2('process_title')
       AND DEL_FLAG = 1;
  
    -- 原有数据删除,重新插入
    UPDATE TZ_FREE_TICKETS
       SET DEL_FLAG = 0, UPDATE_TIME = SYSDATE
     WHERE PROCESS_TITLE = apex_json.get_varchar2('process_title')
       AND DEL_FLAG = 1; -- 根据流程单据名称更新
  
  ELSE
    SELECT TZ_FREE_TICKETS_DATA_NO_SEQ.NEXTVAL INTO PAR_DATA_NO FROM DUAL; -- 获取当前批次号      
  END IF;

  -- 插入主表数据
  INSERT INTO TZ_FREE_TICKETS
    (DATA_NO,
     OPEN_INVOICE, -- 是否出票 是/否
     APPLY_TIME, -- 申请日期
     PROCESS_TITLE, -- 流程单据名称
     PROCESS_NUMBER, -- OA流程编号
     APPLY_DEPT, -- 申请部门
     APPLY_BY, -- 申请人
     FREE_TICKET_TYPE, -- 免票类型
     ENTER_GARDEN_CAUSE, -- 入园事由
     ENTER_GARDEN_DATE, -- 入园日期 
     TICKET_NAME, -- 票种名称
     TICKET_PRICE, -- 门票单价
     APPLY_NUM, -- 申请入园人数
     FREE_TICKET_PRICE, -- 免票金额
     RECIPIENT_UNIT, -- 领用人/单位
     RECIPIENT_PHONE, --领用人联系电话
     REMARKS, -- 备注
   BUSID -- 景区 莽山221
     )
  VALUES
    (PAR_DATA_NO,
     apex_json.get_varchar2('open_invoice'),
     apex_json.get_varchar2('apply_time'),
     apex_json.get_varchar2('process_title'),
     apex_json.get_varchar2('process_number'),
     apex_json.get_varchar2('apply_dept'),
     apex_json.get_varchar2('apply_by'),
     apex_json.get_varchar2('free_ticket_type'),
     apex_json.get_varchar2('enter_garden_cause'),
     apex_json.get_varchar2('enter_garden_date'),
     apex_json.get_varchar2('ticket_name'),
     apex_json.get_number('ticket_price'),
     apex_json.get_number('apply_num'),
     apex_json.get_number('free_ticket_price'),
     apex_json.get_varchar2('recipient_unit'),
     apex_json.get_varchar2('recipient_phone'),
     apex_json.get_varchar2('remarks'),
     apex_json.get_varchar2('busid')
   );


  -- 插入游客信息表数据
  FOR I IN 1 .. apex_json.get_count('visitors') LOOP
        
    INSERT INTO TZ_FREE_TICKETS_VISITOR
      (DATA_NO,
       VISITOR_NAME, -- 游客姓名
       VISITOR_ID_NUMBER, -- 游客身份证号
       ENTRY_STATUS, -- 入园状态,是 否
       TICKET_ORDER_NO, -- 关联票务订单号
       BUSID
     )
    VALUES
      (PAR_DATA_NO,
       apex_json.get_varchar2('visitors[%d].visitor_name', i),
       apex_json.get_varchar2('visitors[%d].visitor_id_number', i),
       apex_json.get_varchar2('visitors[%d].entry_status', i),
       apex_json.get_varchar2('visitors[%d].ticket_order_number', i),
       apex_json.get_varchar2('busid')
     );
  END LOOP;

  COMMIT;

  -- 设置返回信息
  RETURNOBJ := NEW JSON_OBJECT_T;
  RETURNOBJ.PUT('msg', '成功');
  RETURNOBJ.PUT('code', 200);
  SYS.HTP.PRINT(RETURNOBJ.TO_STRING());

EXCEPTION
  WHEN OTHERS THEN
    V_SQLCODE := SQLCODE;
    V_SQLERRM := SUBSTR(SQLERRM, 1, 2000);
  
    RETURNOBJ := NEW JSON_OBJECT_T;
    RETURNOBJ.PUT('msg', '失败' || V_SQLERRM);
    RETURNOBJ.PUT('code', 500);
    SYS.HTP.PRINT(RETURNOBJ.TO_STRING());
END;

参数

json 复制代码
{
    "data": {
        "open_invoice": "是",
        "apply_time": "2024-05-20",
        "process_title": "测试流程单",
        "process_number": "PR202405200001",
        "apply_dept": "人力资源部",
        "apply_by": "张三",
        "free_ticket_type": "VIP",
        "enter_garden_cause": "商务合作",
        "enter_garden_date": "2024-05-22",
        "ticket_name": "普通门票",
        "ticket_price": 120.00,
        "apply_num": 4,
        "free_ticket_price": 480.00,
        "recipient_unit": "合作伙伴公司",
        "recipient_phone": "13800000000",
        "remarks": "请尽快处理",
        "busid": "221",
        "visitors": [
            {
                "visitor_name": "张三",
                "visitor_id_number": "123456789012345678",
                "entry_status": "是",
                "ticket_order_number": "T11111111"
            },
            {
                "visitor_name": "李四",
                "visitor_id_number": "123456789012345679",
                "entry_status": "是",
                "ticket_order_number": "T11111111"
            },
            {
                "visitor_name": "王五",
                "visitor_id_number": "123456789012345670",
                "entry_status": "是",
                "ticket_order_number": "T11111111"
            },
            {
                "visitor_name": "赵六",
                "visitor_id_number": "123456789012345671",
                "entry_status": "是",
                "ticket_order_number": "T11111111"
            }
        ]
    }
}
相关推荐
morris13135 分钟前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
hycccccch1 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
这个懒人2 小时前
深入解析Translog机制:Elasticsearch的数据守护者
数据库·elasticsearch·nosql·translog
Yan-英杰2 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
NineData2 小时前
NineData云原生智能数据管理平台新功能发布|2025年3月版
数据库
百代繁华一朝都-绮罗生4 小时前
检查是否存在占用内存过大的SQL
数据库·sql
吾日三省吾码4 小时前
Python 脚本:自动化你的日常任务
数据库·python·自动化
CZIDC4 小时前
win11 系统环境下 新安装 WSL ubuntu + ssh + gnome 桌面环境
数据库·ubuntu·ssh
直裾4 小时前
Mapreduce的使用
大数据·数据库·mapreduce
纪元A梦4 小时前
Redis最佳实践——首页推荐与商品列表缓存详解
数据库·redis·缓存