首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从返回SQL结果的存储函数/过程生成JSON?

从返回SQL结果的存储函数/过程生成JSON?
EN

Stack Overflow用户
提问于 2018-05-04 11:32:55
回答 1查看 1.4K关注 0票数 0

我正在Oracle 12.1上测试PLJSON,目的是从表中生成JSON。我已经实现了一个包,它将查询封装到该表。我还验证了使用pljson_dyn可以正确地从表中生成JSON。但是,如果我将查询替换为调用返回表中数据的函数,则会失败。是否有可能作出这一选择?

从select返回ok的代码:

代码语言:javascript
复制
set serveroutput on;
declare 
  ret json_list;
begin
  ret := json_dyn.executeList('select id, denounidad from tgeounipoblacionales where tgeomunicipio_id = 6015');  
  ret.print;
end;
/

结果:

代码语言:javascript
复制
[{
  "ID" : 60150001,
  "DENOUNIDAD" : "Plantio (El)"
}, {
...many lines
...
}, {
  "ID" : 60150033,
  "DENOUNIDAD" : "Pilara (La)"
}]

返回封装的SQL的结果的代码:

代码语言:javascript
复制
  DECLARE
        ret PAQ_TGEOUNIPOBLACIONALES.tipo_TABLA_POBLACIONES;
  BEGIN 

   ret := paq_tgeounipoblacionales.OBTENER_POR_MUNICIPIO ( 6015 );
   FOR indice IN ret.FIRST .. ret.LAST
   LOOP
        DBMS_OUTPUT.put_line ( TO_CHAR( ret (indice).ID ) || ', ' || ret (indice).DENOUNIDAD);
   END LOOP;
  END; 

结果:

代码语言:javascript
复制
60150001, Plantio (El)
...
...
60150033, Pilara (La)

我试图在pljson_dyn中封装对函数的调用。

代码语言:javascript
复制
declare 
  ret json_list;
begin
  ret := json_dyn.executeList( 'paq_tgeounipoblacionales.OBTENER_POR_MUNICIPIO ( 6015 )' );
  ret.print;
end;
Informe de error -
ORA-00900: sentencia SQL no válida
ORA-06512: en "SYS.DBMS_SQL", línea 1120
ORA-06512: en "EDUCOMUNES.JSON_DYN", línea 61
ORA-06512: en línea 4
00900. 00000 -  "invalid SQL statement"
*Cause:    
*Action:

规格包(简化)是:

代码语言:javascript
复制
create or replace PACKAGE            PAQ_TGEOUNIPOBLACIONALES
IS
...
    TYPE tipo_TABLA_POBLACIONES IS TABLE OF TGEOUNIPOBLACIONALES%ROWTYPE
    INDEX BY PLS_INTEGER;
...
     FUNCTION OBTENER_POR_MUNICIPIO
     (
     pe_tgeomunicipio_id  IN TGEOMUNICIPIOS.ID%TYPE
     )
     RETURN tipo_TABLA_POBLACIONES;

...    
END PAQ_TGEOUNIPOBLACIONALES;     

主体包(简化)是:

代码语言:javascript
复制
create or replace PACKAGE BODY            PAQ_TGEOUNIPOBLACIONALES
IS
...

     FUNCTION OBTENER_POR_MUNICIPIO
     (
     pe_tgeomunicipio_id  IN TGEOMUNICIPIOS.ID%TYPE
     )
     RETURN tipo_TABLA_POBLACIONES
     IS       
       l_poblaciones tipo_TABLA_POBLACIONES;       
     BEGIN
        SELECT *
          BULK COLLECT INTO l_poblaciones
          FROM TGEOUNIPOBLACIONALES
         WHERE TGEOMUNICIPIO_ID = pe_tgeomunicipio_id;

        RETURN l_poblaciones;

     END OBTENER_POR_MUNICIPIO;   
...     
END PAQ_TGEOUNIPOBLACIONALES;   

表格结构(简化)是:

代码语言:javascript
复制
 CREATE TABLE "EDUCOMUNES"."TGEOUNIPOBLACIONALES" 
   (    
    "DENOUNIDAD" VARCHAR2(200 BYTE), 
    "ID" NUMBER(*,0),                     => primary key
    "TGEOMUNICIPIO_ID" NUMBER(*,0)        => foreign key
  ...
  );
EN

回答 1

Stack Overflow用户

发布于 2020-04-23 12:48:32

尝试以下几点

(我无法尝试自己,因为我没有一个简单而完整的测试用例--包括表结构和数据-测试,但它应该有效)

代码语言:javascript
复制
set serveroutput on;
declare 
  ret json_list;
begin
  ret := json_dyn.executeList('select * from table(paq_tgeounipoblacionales.OBTENER_POR_MUNICIPIO ( 6015 ));');  
  ret.print;
end;
/

另外,我建议您获得最新的pljson版本(v3)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50173935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档