首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SQL将json文件发送到IBM System i和QSYS2.IFS_WRITE上的IFS

使用SQL将json文件发送到IBM System i和QSYS2.IFS_WRITE上的IFS
EN

Stack Overflow用户
提问于 2021-09-22 03:15:25
回答 2查看 528关注 0票数 1

我想从db2文件中提取数据,并将它们以.json格式写入IFS。下面的代码在向IFS发送一个平面文件时起作用。

代码语言:javascript
复制
BEGIN
CALL QSYS2.IFS_WRITE(
     PATH_NAME =>'/myIFSdir/testout.txt',
                       LINE => '',
                       OVERWRITE => 'REPLACE',
                       END_OF_LINE => 'NONE',
     FILE_CCSID => 1208);

FOR select btbnbr as a
     from gldbfa/glpbt
     where btbnbr in (241858, 241934, 241983, 242534, 242538, 242657, 242708, 242717, 242723)

DO
    CALL QSYS2.IFS_WRITE(
     PATH_NAME => '/myIFSdir/testout.txt',
     LINE => a,
     FILE_CCSID => 1208);
  END FOR;
END;

但是,当添加json格式时,它将不再工作,并会产生错误。

代码语言:javascript
复制
BEGIN
CALL QSYS2.IFS_WRITE(
     PATH_NAME =>'/myIFSdir/testout.json',
                       LINE => '',
                       OVERWRITE => 'REPLACE',
                       END_OF_LINE => 'NONE',
     FILE_CCSID => 1208);

FOR select
     json_object('top' value (json_arrayagg(
             json_object ('number' value btbnbr)
             ))) as a
     from gldbfa/glpbt
     where btbnbr in (241858, 241934, 241983, 242534, 242538, 242657, 242708, 242717, 242723)

DO
    CALL QSYS2.IFS_WRITE(
     PATH_NAME => '/myIFSdir/testout.json',
     LINE => a,
     FILE_CCSID => 1208);
  END FOR;
END;

错误是:

代码语言:javascript
复制
SQL State: 42904
Vendor Code: -7032
Message: [SQL7032] SQL procedure, function, trigger, or variable *N in *N not created. Cause . . . . . :   SQL procedure, function, trigger, or variable *N in *N, or program for compound (dynamic) statement was not created. The compile was not successful. SQL creates an SQL procedure, function, trigger, variable, or a compound (dynamic) statement as a C program that contains embedded SQL.  Errors not found during the initial parsing of the CREATE PROCEDURE, ALTER PROCEDURE, CREATE FUNCTION, ALTER FUNCTION, CREATE TRIGGER, CREATE VARIABLE, or compound (dynamic) statement can be found during the precompile. Recovery  . . . :   If a compile error occurred, see the appropriate listing in QSYSPRT. If the SQL precompile failed, there is always a listing with the error. If the C compile failed, the listing is only created if requested. Specify SET OPTION OUTPUT=*PRINT prior to the routine body in the CREATE PROCEDURE, CREATE FUNCTION, or CREATE TRIGGER statement if listings are required. To see these errors for a compound (dynamic) statement, temporarily change it to a CREATE PROCEDURE statement.

我在V7R3M0上

PTF SF99703为22级

感谢你的帮助,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-22 12:22:21

似乎C代码生成的代码试图创建一个可以接收太大的a的结构

代码语言:javascript
复制
$$$***/                       
typedef struct {              
/***$$$                       
SQL TYPE IS CLOB(2147483647) A
$$$***/                       
_Packed struct A_t {          
   unsigned long length;      
   char  data[2147483647];    
 } A                          
                          ;          
short SQLP_I2;                           
short AT_END;                            
unsigned SQLCursorOpen_0 :1;             
 } SQLP_L4_T;      
SQLP_L4_T SQLP_L4;
*=SEVERE==========> a - CZM0049  The size of object SQLP_L4 exceeds the compiler limit.

如果您需要一个那么大的块,那么我认为您必须询问IBM,或者使用declare/open/fetch (它将使用一个定位器)

但是如果不是,如果15M就足够了,你可以CAST(... AS CLOB(15M))

代码语言:javascript
复制
BEGIN
CALL QSYS2.IFS_WRITE(
     PATH_NAME =>'/myIFSdir/testout.json',
                       LINE => '',
                       OVERWRITE => 'REPLACE',
                       END_OF_LINE => 'NONE',
     FILE_CCSID => 1208);
FOR select
     cast(json_object('top' value (json_arrayagg(
             json_object ('number' value btbnbr)
             ))) as clob(15m)) as a
     from (values 241858, 241934, 241983, 242534, 242538, 242657, 242708, 242717, 242723) e (btbnbr)
DO
    CALL QSYS2.IFS_WRITE(
     PATH_NAME => '/myIFSdir/testout.json',
     LINE => a,
     FILE_CCSID => 1208);
  END FOR;
end
票数 2
EN

Stack Overflow用户

发布于 2021-09-23 02:11:48

一旦切换到json_arrayagg,就不需要for循环了。json_objectjson_arrayagg的整个选择可以指定为ifs_write过程的line参数的值。

代码语言:javascript
复制
CALL QSYS2.IFS_WRITE(                                    
     PATH_NAME => '/home/steve/srcmbr.json',          
  overwrite => 'REPLACE',                                
     LINE => (                                           
select  json_arrayagg(                                   
             json_object('srcseq' value a.srcseq,        
                         'srcdat' value a.srcdat,        
                         'srcdta' value rtrim(a.srcdta)) 
         ) json                                          
from qrpglesrc a ),                                      
     FILE_CCSID => 1208)                                 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69277741

复制
相关文章

相似问题

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