JGYBZX_G
2019-06-19 08:28
采纳率: 50%
浏览 1.6k

PROCEDURE SCOTT.TEST_POR 编译错误 错误:PLS-00302: 必须声明 'GET_ELEM' 组件 ?

编译存储过程报错,提示我,必须先声明get_elem组件

问题描述:自己在学习json的相关知识,其中有一个是利用pl/sql解析json格式的数据,根据教程写了一个比较简单的存储过程,编译的时候报错。
错误位置在最后一部分的for循环取数据的时候。
图片说明

经过检查,发现json_list中有这个get_elem方法,被注释掉了,如何启用?

图片说明

具体代码如下:

CREATE OR REPLACE PROCEDURE TEST_POR AS
  --准备工作
  G_JSON_VACHAR VARCHAR2(4000); --声明存储json数据的的g_json_varchar
  G_JSON_ALL    JSON; --声明json格式,存储整个json
  G_JSON_PART   JSON; --存储部分数据 applelist
  G_JSON_LIST   JSON_LIST; --存放json_list列表
  G_MARKETCODE  VARCHAR2(8);
  G_MARKETNAME  VARCHAR2(20);
  G_ADDRESS     VARCHAR2(40);
  G_TEL         VARCHAR2(15);
  G_NAME        VARCHAR2(20);
  G_FRUITCODE   VARCHAR2(20);
BEGIN
  G_JSON_VACHAR := '{
    "marketcode": "123456",
    "marketname": "好吃的水果店",
    "address": "一个好地方",
    "tel": "12345678901",
    "fruitlist": {
        "name": "apple",
        "fruitcode": "223344",
        "applelist": [
            {
                "applename": "redapple ",
                "applecode": "111000",
                "price": "10"
            },
            {
                "applename": "greenapple ",
                "applecode": "111111",
                "price": "12"
            },
            {
                "applename": "yellowapple ",
                "applecode": "111222",
                "price": "8"
            }
        ]
    }
}';
  G_JSON_ALL    := JSON(G_JSON_VACHAR);
  --获取第一层
  G_MARKETCODE := JSON_EXT.GET_STRING(G_JSON_ALL, 'marketcode');
  G_MARKETNAME := JSON_EXT.GET_STRING(G_JSON_ALL, 'marketname');
  G_ADDRESS    := JSON_EXT.GET_STRING(G_JSON_ALL, 'address');
  G_TEL        := JSON_EXT.GET_STRING(G_JSON_ALL, 'tel');
  --获取第二层
  G_NAME      := JSON_EXT.GET_STRING(G_JSON_ALL, 'fruitlist.name');
  G_FRUITCODE := JSON_EXT.GET_STRING(G_JSON_ALL, 'fruitlist.fruitcode');
  --获取第三层,利用json_list来存放json列表
  G_JSON_LIST := JSON_LIST();
  G_JSON_PART := JSON(); --用来存放一部分的数据,applelist中的数据
  G_JSON_LIST := JSON_EXT.GET_JSON_LIST(G_JSON_ALL, 'fruitlist.applelist');

  --利用循环返回每个json部分的值
  FOR I IN 1 .. G_JSON_LIST.COUNT LOOP
    --读取每个品种的具体信息
    G_JSON_PART := JSON(G_JSON_LIST.GET_ELEM(I));  

    G_JSON_LIST.
    DBMS_OUTPUT.PUT_LINE(JSON_EXT.GET_STRING(G_JSON_PART, 'applename'));
    DBMS_OUTPUT.PUT_LINE(JSON_EXT.GET_STRING(G_JSON_PART, 'applecode'));
    DBMS_OUTPUT.PUT_LINE(JSON_EXT.GET_STRING(G_JSON_PART, 'price'));
  END LOOP;
END;
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • JGYBZX_G 2019-06-19 09:56
    已采纳

    自己琢磨出来了,如何启用注释掉的方法。以上边的问题get_elem 为例

    在第一个页面找到get_elem 方法的定义,复制粘贴下来。

    图片说明

    在第二个页面找到get_elem 方法的具体实现,也是复制粘贴出来

    图片说明

    最后只需要执行一下就行了。完美。哈哈哈哈哈
    之后编译就没有问题了。

    打赏 评论

相关推荐 更多相似问题