插入带有XML列值的行

要在包含XML列的表中插入行,可以使用SQL INSERT语句。

您插入XML列中的文档必须是格式正确的XML文档,符合XML 1.0 规范中的定义。 如果文档节点不存在,则将隐式创建一个。 应用程序数据类型可以是 XML(XML AS BLOB、XML AS CLOB、XML AS DBCLOB)、字符或二进制

建议 :从主机变量中插入XML数据,而不是文字,这样 Db2 数据库服务器就可以使用主机变量数据类型来确定一些编码信息。

应用程序中的XML数据可以是文本XML格式或二进制XML格式(Extensible Dynamic Binary XML Db2 Client/Server Binary XML Format )。二进制XML格式仅适用于 JDBC、SQLJ和 ODBC 应用程序。 将数据插入到 XML 列中时,它必须转换为其 XML 分层格式。 当XML数据直接从主机变量插入到XML列中时, Db2 数据库服务器会隐式执行此操作。 或者,您可以在执行插入操作时明确调用XMLPARSE函数,将数据转换为XML分层格式。

在插入文档时,您可以根据已注册的XML模式验证XML文档。 如果您要插入文档的XML列中包含XML模式修改器,则会自动进行验证。 否则,您可以调用DSN_XMLVALIDATE函数进行XML模式验证。 只有在文档为文本XML格式时,您才能在插入文档时进行验证。

下列示例说明了如何将 XML 数据插入到 XML 列中。 这些示例使用表 MYCUSTOMER,它是样本 CUSTOMER 表的副本。 待插入的XML数据如下所示:
<customerinfo xmlns="http://posample.org" Cid="1015">
<name>Christine Haas</name>
<addr country="Canada">
<street>12 Topgrove</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N8X-7F8</pcode-zip>
</addr>
<phone type="work">905-555-5238</phone>
<phone type="home">416-555-2934</phone>
</customerinfo>
示例 :在 JDBC 应用程序中,将文件 c6.xml 中的文本XML数据作为二进制数据读取,并将数据插入到XML列中:
PreparedStatement insertStmt = null;
String sqls = null;
int cid = 1015;
sqls = "INSERT INTO MyCustomer (Cid, Info) VALUES (?, ?)";
insertStmt = conn.prepareStatement(sqls);
insertStmt.setInt(1, cid);
File file = new File("c6.xml");
insertStmt.setBinaryStream(2, new FileInputStream(file), (int)file.length());
insertStmt.executeUpdate();
示例 :假设文件 c7.xml 中的数据与文件 c6.xml 中的数据相同,但数据以二进制XML格式存储。 在 JDBC 应用程序中,读取文件 c7.xml 中的数据,并将数据插入XML列:
…
SQLXML info = conn.createSQLXML();
OutputStream os = info.setBinaryStream();
FileInputStream fis = new FileInputStream("c7.xml");
int read;
while ((read = fis.read ()) != -1) {
  os.write (read);
}
PreparedStatement insertStmt = null;
String sqls = null;
int cid = 1015;
sqls = "INSERT INTO MyCustomer (Cid, Info) VALUES (?, ?)";
insertStmt = conn.prepareStatement(sqls);
insertStmt.setInt(1, cid);
insertStmt.setSQLXML(2, info);
insertStmt.executeUpdate(); 
示例 :在静态嵌入式C应用程序中,将XML AS BLOB主机变量中的数据插入到XML列中:
EXEC SQL BEGIN DECLARE SECTION;
   sqlint64 cid;
   SQL TYPE IS XML AS BLOB (10K) xml_hostvar;
EXEC SQL END DECLARE SECTION;
…
cid=1015;
/* Read data from file c6.xml into xml_hostvar */
…
EXEC SQL INSERT INTO MyCustomer (Cid,Info) VALUES (:cid, :xml_hostvar);
示例 :在静态嵌入式COBOL应用程序中,将字符XML主机变量中的数据插入到XML列中:
…
 WORKING-STORAGE SECTION.                                  
…
* XML HOST VARIABLES
 01  CLOB-XML-IN USAGE IS SQL TYPE IS XML AS CLOB(10K).    
 01  CLOB-XML-OUT USAGE IS SQL TYPE IS XML AS CLOB(10K).   
* VARIABLE USED FOR DISPLAY OF THE RETRIEVED VALUE
 01  CLOB-XML-OUT-DISPLAY.                                 
   02  CLOB-XML-OUT-DISPLAY-LENGTH                         
       PIC 9(9) COMP.                                      
   02  CLOB-XML-OUT-DISPLAY-DATA.                          
       49  FILLER PIC X(10240).                            
*****************************************************     
* SQL INCLUDE FOR SQLCA                             *     
*****************************************************     
      EXEC SQL INCLUDE SQLCA  END-EXEC.                   
 PROCEDURE DIVISION.                                      
* USE XMLPARSE TO CONVERT THE INPUT DATA TO THE XML TYPE.
      EXEC SQL SET :CLOB-XML-IN=                            
       XMLPARSE(DOCUMENT                                        
       '<customerinfo xmlns="http://posample.org" Cid="1015">' ||
       '<name>Christine Haas</name>'                           ||
       '<addr country="Canada">'                               ||
       '<street>12 Topgrove</street>'                          ||
       '<city>Toronto</city>'                                  ||
       '<prov-state>Ontario</prov-state>'                      ||
       '<pcode-zip>N8X-7F8</pcode-zip>'                        ||
       '</addr>'                                               ||
       '<phone type="work">905-555-5238</phone>'               ||
       '<phone type="home">416-555-2934</phone>'               ||
       '</customerinfo>')                                        
      END-EXEC.
* INSERT THE DATA.
      EXEC SQL INSERT INTO CUSTOMER(CID, INFO)                  
       VALUES (1015,:CLOB-XML-IN)                              
      END-EXEC.                                                 
* CHECK THE VALUE THAT YOU INSERTED.
      EXEC SQL SELECT INFO                                     
       INTO :CLOB-XML-OUT FROM CUSTOMER                         
       WHERE CID=1015                                           
      END-EXEC.                                                 
      MOVE CLOB-XML-OUT TO CLOB-XML-OUT-DISPLAY.                
      DISPLAY                                                   
      CLOB-XML-OUT-DISPLAY-DATA(1:CLOB-XML-OUT-DISPLAY-LENGTH).