首页 > 解决方案 > 如何在 PL/SQL 中的 Map 中返回结果?

问题描述

我想从存储过程返回一个映射到我的 Java 代码。PL/SQL 的结果采用 Map 格式,如Map<key, List>。是否可以返回这样的数据?

我已经在一个字符串中返回了整个数据,并且从 java 类中我使用了拆分逻辑来拆分数据并将它们保存在适当的字段中。像一个例子:

String[] lines = resultString.split(System.lineSeparator());  List<MessageVO> resultPerList = new ArrayList<>();
  for (String line : lines) {
          MessageVO message = new MessageVO();
          String[] fieldArray = line.split(":", 0);
         String field= fieldArray[0];
          message.setField(field);
         resultPerList.add(message);
 }

标签: javadatabaseplsql

解决方案


如果您喜欢 PL/SQL 并且结果列表很小,那么您的解决方案(在 SQL 中构建数据)很好。在 PL/SQL 中,您可以利用listagg 语句
这是功能示例:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class sasafd {

    public static void main(String[] args) {
        String resultString = "key1:valuea:valueb:valuec"
            + System.lineSeparator()
            + "key2:valuea:valueb:valuec";

        String[] lines = resultString.split(System.lineSeparator());
        Map<String, List<String>> resultMap = new HashMap<String, List<String>>();
        for (String line : lines) {
            String[] fieldArray = line.split(":", 0);
            for (String value : fieldArray)
                if (resultMap.containsKey(fieldArray[0])) {
                    resultMap.get(fieldArray[0]).add(value);
                } else {
                    resultMap.put(fieldArray[0], new LinkedList<String>());
                }
        }       
        System.out.println(convertWithStream(resultMap));
    }

    public static String convertWithStream(Map<String, List<String>> map) {
        String mapAsString = map.keySet().stream().map(key -> key + "=" + map.get(key))
                .collect(Collectors.joining(", ", "{", "}"));
        return mapAsString;
    }
}

输出:

{key1=[valuea, valueb, valuec], key2=[valuea, valueb, valuec]}

如果您喜欢更多表格数据,则可以从 DB 中使用此代码中的想法:

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class sasafd {
    public static void main(String[] args) {
        String[][] resultSet =
             {{"key1","valuea"},{"key1","valueb"},{"key1","valuec"}
              ,{"key2","valuea"},{"key2","valueb"},{"key2","valuec"}};

        Map<String, List<String>> resultMap = new HashMap<String, List<String>>();
        for (String[] line : resultSet) {
                if (resultMap.containsKey(line[0])) {
                    resultMap.get(line[0]).add(line[1]);
                } else {
                    resultMap.put(line[0], new LinkedList<String>());
                    resultMap.get(line[0]).add(line[1]);
                }
        }       
        System.out.println(convertWithStream(resultMap));
    }

    public static String convertWithStream(Map<String, List<String>> map) {
        String mapAsString = map.keySet().stream().map(key -> key + "=" + map.get(key))
                .collect(Collectors.joining(", ", "{", "}"));
        return mapAsString;
    }
}

你也可以试试 ORM。如果您不喜欢 PL/SQL 中的冒号分隔文本,您也可以使用 XML、JSON、...

JDBC 不支持 Map 结果。


推荐阅读