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"
            }
        ]
    }
}
相关推荐
ClickHouseDB6 小时前
ClickHouse托管Postgres:OLTP+OLAP,新能力解锁最佳数据平台
java·前端·数据库
数智化管理手记7 小时前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
吴声子夜歌7 小时前
MongoDB 4.2——选择片键
数据库·mongodb
天天进步一点点7 小时前
QSqlQuery删除sqlite数据库执行drop数据表报错database table is locked unable to fetch row问题
数据库·oracle·sqlite
音视频工程实战8 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水8 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
TDengine (老段)8 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
东方佑8 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
云和恩墨9 小时前
「云帆计划·长沙站」活动成功举办,云和恩墨与紫薇垣和湖南金悦科技分别签约并授牌,本地伙伴生态建设加速
数据库·科技
千维百策66610 小时前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库