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"
            }
        ]
    }
}
相关推荐
2301_800256112 分钟前
第九章:空间网络模型(空间网络查询、数据模型、Connected、with Recursive、pgRouting)
网络·数据库·算法·postgresql·oracle
霖霖总总1 小时前
[小技巧19]MySQL 权限管理全指南:用户、角色、授权与安全实践
数据库·mysql·安全
heartbeat..5 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
麦聪聊数据8 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
AC赳赳老秦8 小时前
DeepSeek 私有化部署避坑指南:敏感数据本地化处理与合规性检测详解
大数据·开发语言·数据库·人工智能·自动化·php·deepseek
YMatrix 官方技术社区9 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
辞砚技术录10 小时前
MySQL面试题——索引2nd
数据库·mysql·面试
linweidong10 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
欧亚学术11 小时前
突发!刚刚新增17本期刊被剔除!
数据库·论文·sci·期刊·博士·scopus·发表
oMcLin11 小时前
如何在Oracle Linux 8.4上搭建并优化Kafka集群,确保高吞吐量的实时数据流处理与消息传递?
linux·oracle·kafka