Oracle 11g(Red Hat上)を使用しています。奇妙なOracle XMLType.getClobVal()結果
CREATE TABLE PROJECTS
(
PROJECT_ID NUMBER(*, 0) NOT NULL,
PROJECT SYS.XMLTYPE,
);
(Windowsの場合)は、Oracle SQL Developerを使用して、私が行います:それは作品
select T1.PROJECT P1 from PROJECTS T1 where PROJECT_ID = '161';
私はXMLType列を持つ単純な正規のテーブルを持っています。私は1つの細胞を得る。 XMLファイル全体をダブルクリックしてダウンロードできます。
は、それから私は、CLOBとして結果を取得しようとした:
select T1.PROJECT.getClobVal() P1 from PROJECTS T1 where PROJECT_ID = '161';
それは動作します。私は1つの細胞を得る。私はダブルクリックして全体のテキストを見て、それをコピーすることができます。しかし問題がある。クリップボードにコピーすると、最初の4000文字しか得られません。位置4000に0x00文字があり、残りのCLOBはコピーされていないようです。
// ... create projectsStatement
Reader reader = projectsStatement.getResultSet().getCharacterStream("P1");
BufferedReader bf = new BufferedReader(reader);
char buffer[] = new char[ 1024 ];
int count = 0;
int globalPos = 0;
while ((count = bf.read(buffer, 0, buffer.length)) > 0)
for (int i = 0; i < count; i++, globalPos++)
if (buffer[ i ] == 0)
throw new Exception("ZERO at " + Integer.toString(globalPos));
Readerは完全なXMLを返しますが、私の例外が位置4000でのNULL文字がありますので、私はこの1バイトを取り除くことができスローされますが、これはむしろ、次のようになります。
これを確認するために、私はJavaで小切手を書きました奇妙な回避策。
私はVARCHAR2を使用しませんが、おそらくこの問題はVARCHAR2の制限(4000バイト)に関係していますか?他のアイデア?これはOracleのバグですか、何か不足していますか?
--------------------
値次のストアドプロシージャを使用して挿入された:それを呼び出すために使用さ
create or replace
procedure addProject(projectId number, projectXml clob) is
sqlstr varchar2(2000);
begin
sqlstr := 'insert into projects (PROJECT_ID, PROJECT) VALUES (:projectId, :projectData)';
execute immediate sqlstr using projectId, XMLTYPE(projectXml);
end;
Javaコード:
try (CallableStatement cs = connection.prepareCall("{call addProject(?,?)}"))
{
cs.setInt("projectId", projectId);
cs.setCharacterStream("projectXml", new StringReader(xmlStr) , xmlStr.length());
cs.execute();
}
-------------------- [編集]を。簡単なテスト--------------------
私はあなたの答えから学んだすべてを使用します。最も簡単なテーブルを作成してください:
create table T1 (P XMLTYPE);
2つのCLOBをXMLで準備してください。最初にヌル文字で、2番目ではありません。
declare
P1 clob;
P2 clob;
P3 clob;
begin
P1 := '<a>';
P2 := '<a>';
FOR i IN 1..1000 LOOP
P1 := P1 || '' || chr(0);
P2 := P2 || '';
END LOOP;
P1 := P1 || '</a>';
P2 := P2 || '</a>';
チェックnullが最初CLOBではなく秒1である場合:
DBMS_OUTPUT.put_line(DBMS_LOB.INSTR(P1, chr(0)));
DBMS_OUTPUT.put_line(DBMS_LOB.INSTR(P2, chr(0)));
予想通り我々はなります:
14
0
はXMLTYPEに最初のCLOBを挿入するようにしてください。うまくいかないだろう。この値を挿入することはできません。
insert into T1 (P) values (XMLTYPE(P1));
2番目のCLOBをXMLTYPEに挿入してみます。それは動作します:
insert into T1 (P) values (XMLTYPE(P2));
挿入されたXMLを3番目のCLOBに読み込もうとします。それは動作します:
select T.P.getClobVal() into P3 from T1 T where rownum = 1;
ヌルがあるかどうかチェックしてください。これは、データベース内部にはヌルがなく、限り、我々はPL/SQLコンテキスト内にあるように、ヌルがないことを縫い目
DBMS_OUTPUT.put_line(DBMS_LOB.INSTR(P3, chr(0)));
:NO nullはありません。しかし、私は(Windowsの場合)SQL Developerで次のSQLを使用したり(Red HatのEEとTomcat7上)、Javaで私はすべて返されたCLOB内の位置4000でのNULL文字を取得しようとすると:
select T.P.getClobVal() from T1 T;
BR、 JM
を
のようなエラーがあなたが 'utl_file'を使用してファイルに書き込むことはできませんし、内容がどのように見えるか見ますか? 'プロジェクトからXMLType.getClobVal(PROJECT)を選択することもできますか? ' (何も機能的に違いはありません) – Annjawn
コラムにはどのようにして人が入っていましたか?異なるクライアントが同じことを見ていると、検索で問題が発生する可能性は低いですか?また、値のサブリングを選択し、null charがまだそこにあるかどうかを確認することもできます。 –
utlfile.sqlとprvtfile.plbを実行しましたが、utl_file(ORA-06521:PL/SQL:エラー・マッピング関数)を使用できません。 – Mikosz