最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

json - How to get values ​from an array in Oracle PLSQL - Stack Overflow

programmeradmin0浏览0评论

I have the following problem.

I'm receiving data from an external API and I need to store the tag data that is coming as an array.

I already tried to do it the following way, but without success.

DECLARE
 v_name         VARCHAR2(100);
 v_email        VARCHAR2(100);

 TYPE t_tags IS TABLE OF VARCHAR2(100);
 v_tags t_tags;
BEGIN

 SELECT name, email
 INTO v_name, v_email
 FROM JSON_TABLE(:body, '$'
    COLUMNS (
        name  VARCHAR2(100)  PATH '$.leads.name',
        email VARCHAR2(100)  PATH '$.leads.email'
    );

 SELECT CAST(COLLECT(tag) AS t_tags)
    INTO v_tags
    FROM JSON_TABLE(:body, '$.leads.tags[*]'
        COLUMNS (tag VARCHAR2(100) PATH '$'));

 IF v_tags IS NOT NULL OR v_tags.COUNT > 0 THEN
  FOR i IN 1 .. v_tags.COUNT LOOP
     v_tag := v_tags(i);
    
    INSERT INTO LEAD_TAG (TAG, COR, ETQ_CAT)
            VALUES ('TESTING', 'TESTING', 'TESTING')
            RETURNING ID INTO v_tag_id;
  END LOOP;
 END IF;
END;

could anyone help me?

I have the following problem.

I'm receiving data from an external API and I need to store the tag data that is coming as an array.

I already tried to do it the following way, but without success.

DECLARE
 v_name         VARCHAR2(100);
 v_email        VARCHAR2(100);

 TYPE t_tags IS TABLE OF VARCHAR2(100);
 v_tags t_tags;
BEGIN

 SELECT name, email
 INTO v_name, v_email
 FROM JSON_TABLE(:body, '$'
    COLUMNS (
        name  VARCHAR2(100)  PATH '$.leads.name',
        email VARCHAR2(100)  PATH '$.leads.email'
    );

 SELECT CAST(COLLECT(tag) AS t_tags)
    INTO v_tags
    FROM JSON_TABLE(:body, '$.leads.tags[*]'
        COLUMNS (tag VARCHAR2(100) PATH '$'));

 IF v_tags IS NOT NULL OR v_tags.COUNT > 0 THEN
  FOR i IN 1 .. v_tags.COUNT LOOP
     v_tag := v_tags(i);
    
    INSERT INTO LEAD_TAG (TAG, COR, ETQ_CAT)
            VALUES ('TESTING', 'TESTING', 'TESTING')
            RETURNING ID INTO v_tag_id;
  END LOOP;
 END IF;
END;

could anyone help me?

Share Improve this question asked Feb 5 at 18:42 DevworldDevworld 251 silver badge2 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 3

You do not need a collection. Use INSERT ... SELECT from the JSON_TABLE.

BEGIN
  INSERT INTO LEAD_TAG (TAG, COR, ETQ_CAT)
  SELECT tag, name, email
  FROM   JSON_TABLE(
           :body,
           '$.leads'
           COLUMNS (
             name  VARCHAR2(100)  PATH '$.name',
             email VARCHAR2(100)  PATH '$.email',
             NESTED PATH '$.tags[*]' COLUMNS (
               tag VARCHAR2(100) PATH '$'
             )
           )
         );
END;
/

Which, for the table:

CREATE TABLE lead_tag(
  tag VARCHAR2(20),
  cor VARCHAR2(20),
  etq_cat VARCHAR2(20)
);

Then is :body contains:

{"leads":{"name":"Alice","email": "[email protected]","tags":["A","B"]}}

Then, after the INSERT, the table contains:

TAG COR ETQ_CAT
A Alice [email protected]
B Alice [email protected]

fiddle

发布评论

评论列表(0)

  1. 暂无评论