Генерация файла json в базе данных вместо java

#java #spring #oracle #spring-boot #plsql

#java #spring #Oracle #spring-загрузка #plsql

Вопрос:

Я читаю его table из базы данных с помощью resultset . позже я использую эти данные для генерации файла json.

Я хочу сгенерировать json файл в базе данных и вернуть этот файл в java , потому что мой Java-код будет потреблять POST API.

код выглядит примерно так

     String query="select * from dynamicentitygtt";
    PreparedStatement prepstatement=connection.prepareStatement(query);
    ResultSet rs=prepstatement.executeQuery()
        while rs.next()
        {
          //Load data to POJO
            
        }
      //call method to generate json file.
      //Inject file data to API
  

чего я хочу.

 String query="select * from dynamicentitygtt";
        PreparedStatement prepstatement=connection.prepareStatement(query);
        ResultSet rs=prepstatement.executeQuery()
        //here I want file from database.
  

Моя база данных должна возвращать файл json. я могу создать процедуру в базе данных. я также могу использовать callable. Я также могу создать файл json из таблицы.
Но я не знаю, как вернуть файл из базы данных.

простите меня, если я неправильно понимаю.

Комментарии:

1. Вы могли бы создать процедуру pl / sql, которая выполняет запрос и возвращает clob, содержащий желаемый json (и вызвать процедуру из Java). Для этого есть по крайней мере пара вариантов, в зависимости от вашей версии Oracle и ваших предпочтений. Я лично использую github.com/pljson/pljson но если у вас Oracle 18 или более поздней версии, вы, вероятно, можете сделать это с помощью собственных методов JSON.

2. «Я не знаю, как вернуть файл из базы данных» Идеально — это определяет реальную проблему, с которой вам нужна помощь. Прочитайте о UTL_FILE пакете или — в более общем плане — используйте любой удобный для вас метод, чтобы прочитать об операциях с файлами из базы данных Oracle. Это не имеет ничего общего с содержимым файлов (JSON или что-то еще).

3. @mathguy большое тебе спасибо, mathguy. Я прохожу через то же самое.

4. В таких вопросах следует указывать версию Oracle. Более поздние версии базы данных имеют расширенные возможности.

5. Я использую oracle 18c.

Ответ №1:

Поскольку вы отметили, что используете Oracle 18c, у вас есть доступ к функциям SQL JSON_OBJECT, JSON_OBJECTAGG, JSON_ARRAY и JSON_ARRAYAGG. Используя эти функции, вы должны быть в состоянии создать нужную вам структуру JSON просто с помощью SQL-запроса вместо того, чтобы генерировать файл и передавать его обратно в ваш Java-вызов. Следует отметить, что если вы генерируете большие объекты JSON, вам потребуется изменить предложение RETURNING в любом из вызовов функций JSON в запросе, иначе ваш JSON будет недействительным.

Ниже приведены несколько примеров использования функций:

Запрос # 1

 WITH
    emp (employee_id,
         first_name,
         last_name,
         department_number)
    AS
        (SELECT 1, 'John', 'Doe', 100 FROM DUAL
         UNION ALL
         SELECT 2, 'Jane', 'Smith', 100 FROM DUAL
         UNION ALL
         SELECT 3, 'Robert', 'Jones', 200 FROM DUAL
         UNION ALL
         SELECT 4, 'Alan', 'Carter', 300 FROM DUAL)
SELECT json_arrayagg (json_object (*))
  FROM emp;
  

Результат # 1 (улучшен)

 [
  {
    "EMPLOYEE_ID": 1,
    "FIRST_NAME": "John",
    "LAST_NAME": "Doe",
    "DEPARTMENT_NUMBER": 100
  },
  {
    "EMPLOYEE_ID": 2,
    "FIRST_NAME": "Jane",
    "LAST_NAME": "Smith",
    "DEPARTMENT_NUMBER": 100
  },
  {
    "EMPLOYEE_ID": 3,
    "FIRST_NAME": "Robert",
    "LAST_NAME": "Jones",
    "DEPARTMENT_NUMBER": 200
  },
  {
    "EMPLOYEE_ID": 4,
    "FIRST_NAME": "Alan",
    "LAST_NAME": "Carter",
    "DEPARTMENT_NUMBER": 300
  }
]
  

Запрос # 2

 WITH
    emp (employee_id,
         first_name,
         last_name,
         department_number)
    AS
        (SELECT 1, 'John', 'Doe', 100 FROM DUAL
         UNION ALL
         SELECT 2, 'Jane', 'Smith', 100 FROM DUAL
         UNION ALL
         SELECT 3, 'Robert', 'Jones', 200 FROM DUAL
         UNION ALL
         SELECT 4, 'Alan', 'Carter', 300 FROM DUAL)
  SELECT json_arrayagg (
             json_object (
                     'department_number' VALUE department_number,
                     'employees' VALUE
                         json_arrayagg (
                             json_object ('first_name' VALUE first_name, 'last_name' VALUE last_name))))
    FROM emp
GROUP BY department_number;
  

Результат # 2 (улучшен)

 [
  {
    "department_number": 100,
    "employees": [
      { "first_name": "John", "last_name": "Doe" },
      { "first_name": "Jane", "last_name": "Smith" }
    ]
  },
  {
    "department_number": 200,
    "employees": [{ "first_name": "Robert", "last_name": "Jones" }]
  },
  {
    "department_number": 300,
    "employees": [{ "first_name": "Alan", "last_name": "Carter" }]
  }
]
  

Ответ №2:

В java, используя приведенный ниже метод, вы можете создать список Map<Строка,String>.

Где Map имеет ключ ColumnName и значение в качестве значения этого столбца.

 public List<Map<String, String>> getList(ResultSet resultSet) throws SQLException {
        List<Map<String, String>> mapList = new ArrayList<>();
        ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
        int columnNumber = resultSetMetaData.getColumnCount();
        while (resultSet.next()) {
            Map<String, String> map = new HashMap<>();
            int count = 1;
            while (count <= columnNumber) {
                String columnName = resultSetMetaData.getColumnName(count);
                map.put(columnName, resultSet.getString(columnName));
                count  ;
            }
            mapList.add(map);
        }
        return mapList;
    }
  

Как только вы сможете создать Map, вы можете создать из него любую строку json или объект json, используя несколько библиотек like this

Это поможет вам.

Комментарии:

1. OP хочет сгенерировать json в db, а не в Java. Итак, war, вы предлагаете ancode для выполнения ist на Java?