Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 使用clob的APEX_JSON打印输出_Oracle_Plsql_Oracle Apex - Fatal编程技术网

Oracle 使用clob的APEX_JSON打印输出

Oracle 使用clob的APEX_JSON打印输出,oracle,plsql,oracle-apex,Oracle,Plsql,Oracle Apex,让我试着解释一下发生了什么。我创建了一个简单的sql脚本来运行apex_json程序,并创建了一个json文件。在这里之前,一切都很好。但是,当我查看创建的JSON文件的内容时,行被打断,文件包含一些不应该包含的回车符。我尝试了不同的组合,但我遇到了麻烦 这是我的代码: 这里是我的json_file.sql(包含sql的脚本)的内容 我使用一个shell脚本运行这个程序,该脚本基本上以这种方式调用sqlplus SQL> whenever sqlerror exit failure; wh

让我试着解释一下发生了什么。我创建了一个简单的sql脚本来运行apex_json程序,并创建了一个json文件。在这里之前,一切都很好。但是,当我查看创建的JSON文件的内容时,行被打断,文件包含一些不应该包含的回车符。我尝试了不同的组合,但我遇到了麻烦

这是我的代码:

这里是我的json_file.sql(包含sql的脚本)的内容

我使用一个shell脚本运行这个程序,该脚本基本上以这种方式调用sqlplus

SQL> whenever sqlerror exit failure;
whenever oserror exit failure;
set serveroutput on size unlimited pages 0 lines 180 long 99999999 head off verify off feed off
@json_query.sql file.json
json被创建,我在这里找到了虚线(请参见下面键EndDate中的值):

有人知道这里发生了什么?我甚至尝试将clob存储在一个表中,然后用一个函数从表中打印出来,但在插入数据时它已经被破坏了。我在某处读到APEX_JSON使用HTP缓冲区写入数据,但我不明白我做错了什么,也不明白JSON为什么会损坏

任何帮助都将不胜感激
谢谢你

问题不在于APEX_JSON,你每180个字符就有一个额外的换行符-这是你的行长-第一个换行符出现在第二个NativeKey名称中

问题是CLOB中的换行符在SQL*Plus行长度处理过程中出错。即使您手动构造一个包含干净JSON内容的CLOB,并执行
dbms_output.put_行(v_CLOB,200,1),它仍将在同一位置添加换行符。据我所知,你似乎对此无能为力;最接近的方法是将
linesize
设置得非常高,但大的CLOB最终会破坏它。顺便说一句,切换到SQLcl似乎可以避免这个问题

您可以在
print\u clob\u to\u output
过程中修复它,方法是将clob拆分为单独的行并逐个打印,而不是像现在这样仅根据字符数进行拆分。(顺便说一句,您的过程有点中断;除此之外,每32767个字符就有一个额外的换行符,因为
put\u line
添加了一个换行符。如果您决定切换到SQLcl,您需要查看一下。)

此版本从当前偏移量查找CLOB中的下一个换行符-
chr(10)
,然后将子字符串从偏移量提取到该字符之前的字符。子字符串,表示没有换行符的完整行,当该行以
put\u line
输出时,它添加自己的行。
chr(10)
l\u偏移量:=l\u字符+1
行丢弃。如果没有换行符,或者最后一行没有换行符,则需要进行一些处理


缓冲区处理——我认为——意味着SQL*Plus不会混淆,也不会将输出包装到额外的行中。

Hello@Alex Poole。首先,感谢您的时间和非常好的解释。我找错地方了。我测试了你的建议,它工作了,我的json现在看起来不错,而且似乎没有损坏。我真的很感谢你在这里的支持。
SQL> whenever sqlerror exit failure;
whenever oserror exit failure;
set serveroutput on size unlimited pages 0 lines 180 long 99999999 head off verify off feed off
@json_query.sql file.json
$ cat -vte file.json
{$
"Date":"2020-03-31"$
,"DomainCode":"00001"$
,"LegalEntityCode":"00055"$
,"Keys":[$
{$
"NativeKey":"129582692"$
,"MasterKey":"329323111430011996"$
,"EndDate":"9999-12-31"$
}$
,{$
"NativeKey$
":"14735034"$
,"MasterKey":"329390935000331576"$
,"EndDate":"9999-12-31"$
}$
,{                                                                                                         $
$
"NativeKey":"98102571"$
,"MasterKey":"329361261430632555"$
,"EndDate":"9999-12-31"$
}$
,{$
"NativeKey":"175080315"$
,"MasterKey":"329361251430284082"$
,"EndDate":"9999-12-31"$
}$
,{$
"Nativ$
eKey":"34262142"$
,"MasterKey":"329323245070279903"$
,"EndDate":"9999-12-31"$
                                                                                                         $
}$
,{$
"NativeKey":"84094570"$
,"MasterKey":"329395105070385872"$
,"EndDate":"9999-12-31"$
}$
,{$
"NativeKey":"43337038"$
,"MasterKey":"329323085070265746"$
,"EndDate":"9999-12-31"$
}$
,{$
"Na$
tiveKey":"86265510"$
,"MasterKey":"329300305070004470"$
,"EndDate":"9999-12-3                                                                                                         $
1"$
}$
,{$
"NativeKey":"96926906"$
,"MasterKey":"329323031430673339"$
,"EndDate":"9999-12-31"$
}$
,{$
"NativeKey":"96760800"$
,"MasterKey":"329323031430666865"$
,"EndDate":"9999-12-31"$
}$
,{$
$
"NativeKey":"94063822"$
,"MasterKey":"329323031430571553"$
,"EndDate":"9999-1                                                                                                         $
2-31"$
}$
,{$
"NativeKey":"14529231"$
,"MasterKey":"329390935000077722"$
,"EndDate":"9999-12-31"$
}$
,{$
"NativeKey":"173183320"$
,"MasterKey":"329344461430004834"$
,"EndDate":"9999-12-31"$
}$
$
,{$
"NativeKey":"34044987"$
,"MasterKey":"329323245070056084"$
,"EndDate":"99                                                                                                         $
99-12-31"$
}$
]$
}$
declare
    v_clob clob;
    procedure print_clob_to_output (p_clob in clob)
    is
      l_offset     pls_integer := 1;
      l_chars      pls_integer;
    begin
        --dbms_output.put_line('Print CLOB');
        loop
            exit when l_offset > dbms_lob.getlength(p_clob);
            l_chars := dbms_lob.instr(p_clob, chr(10), l_offset, 1);
            if l_chars is null or l_chars = 0 then
                l_chars := dbms_lob.getlength(p_clob) + 1;
            end if;
            dbms_output.put_line('> ' || dbms_lob.substr(p_clob, l_chars - l_offset, l_offset));
            l_offset := l_chars + 1;
        end loop;
    end print_clob_to_output;
begin
...