2016-07-05 43 views
1

我有一个带有XMLTYPE列的表,并且我想以XML格式向其中插入数据,但信息不是以XML格式从服务器来的。我正在考虑实现一个从服务器获取值并将数据以XML格式插入到该列的存储过程,但该过程给了我正确的括号错误,我不知道为什么。Oracle将数据插入到XML类型表

下面的代码:

CREATE TABLE xml_tab (
id  NUMBER, 
xml_data XMLTYPE 
); 
ALTER TABLE XML_TAB 
MODIFY (ID DEFAULT XML_TAB_SEQ.NEXTVAL); 

而且我想要执行存储过程。

CREATE OR REPLACE PROCEDURE insert_xml_proc (
dish_name IN VARCHAR, 
dish_type IN VARCHAR, 
dish_image IN VARCHAR) AS 
BEGIN 
INSERT INTO XML_TAB (XML_DATA) values(
xmltype(
'<xml> 
<item> 
    <DISH_ID>'XML_TAB_SEQ.CURRVAL'</DISH_ID> 
    <DISH_NAME>'dish_name'</DISH_NAME> 
    <DISH_TYPE>'dish_type'</DISH_TYPE> 
    <DISH_IMAGE>'dish_image'</DISH_IMAGE> 
</item></xml>')); 
END; 

这个想法是,我在PHP中使用我的表单将一些变量发送到存储过程插入此数据。插入到常规表中,然后从中获取数据以XML格式插入到XML表中也可以,但问题依然存在。

谢谢!

编辑:程序v2由于别名不起作用。

CREATE OR REPLACE PROCEDURE insert_xml_v2_proc (
dish_name IN VARCHAR2, 
dish_type IN VARCHAR2, 
dish_image IN VARCHAR2) AS 
BEGIN 
insert into xml_tab (xml_data) select xmlelement("xml", xmlelement("item", 
           xmlforest(XML_TAB_SEQ.nextval as dish_id, 
              dish_name, 
              dish_type, 
              dish_image))) xmldata from dual; 
END; 
/
+0

请问你得到了什么确切的错误信息? – Boneist

回答

2

这是因为你没有正确拼接。它应该是:

CREATE OR REPLACE PROCEDURE insert_xml_proc (
dish_name IN VARCHAR2, 
dish_type IN VARCHAR2, 
dish_image IN VARCHAR2) AS 
BEGIN 
INSERT INTO XML_TAB (XML_DATA) values(
xmltype(
'<xml> 
<item> 
    <DISH_ID>'||XML_TAB_SEQ.CURRVAL||'</DISH_ID> 
    <DISH_NAME>'||dish_name||'</DISH_NAME> 
    <DISH_TYPE>'||dish_type||'</DISH_TYPE> 
    <DISH_IMAGE>'||dish_image||'</DISH_IMAGE> 
</item></xml>')); 
END; 
/

N.B.还需要注意的是我已经转换您的参数从VARCHARVARCHAR2

有生成XML的更好的方法,不过,如:

with sample_data as (select 'a' dish_name, 'b' dish_type, 'c' dish_image from dual) 
select xmlelement("xml", xmlelement("item", 
            xmlforest(XML_TAB_SEQ.nextval as dish_id, 
               dish_name, 
               dish_type, 
               dish_image))) xmldata 
from sample_data; 

XMLDATA 
------------------------------------------------------------------------------------------------------------------------ 
<xml><item><DISH_ID>262</DISH_ID><DISH_NAME>a</DISH_NAME><DISH_TYPE>b</DISH_TYPE><DISH_IMAGE>c</DISH_IMAGE></item></xml> 
+0

工程就像一个魅力,谢谢你先生:D – Ribeiro

+1

有更好的方式从列/参数生成XML - 我已经添加了一个例子到我的回答 – Boneist

+0

是否有可能包括第二种方法生成XML到过程中的程序插入语句? – Ribeiro

1

我想应该是这样的(未测试)

CREATE OR REPLACE PROCEDURE insert_xml_proc (
dish_name IN VARCHAR, 
dish_type IN VARCHAR, 
dish_image IN VARCHAR) AS 
BEGIN 
INSERT INTO XML_TAB (XML_DATA) values (
xmlelement("xml", 
    xmlelement("item", 
     xmlelement("DISH_ID", XML_TAB_SEQ.CURRVAL), 
     xmlelement("DISH_NAME", dish_name), 
     xmlelement("DISH_TYPE", dish_type), 
     xmlelement("DISH_IMAGE", dish_image) 
    ) 
) 
); 

另一种方式是像这样的:

create or replace type "item" as object (
"DISH_ID" number, 
"DISH_NAME" varchar2(100), 
"DISH_TYPE" varchar2(100), 
"DISH_IMAGE" varchar2(100)); 

INSERT INTO XML_TAB (XML_DATA) values (
xmlelement("xml", 
    xmltype("item"(XML_TAB_SEQ.CURRVAL, dish_name, dish_type, dish_image)) 
    ) 
); 

或(但在这里我不确定它是否正确):

create or replace type "item" as object (
"DISH_ID" number, 
"DISH_NAME" varchar2(100), 
"DISH_TYPE" varchar2(100), 
"DISH_IMAGE" varchar2(100)); 

create or replace type "xml" as object (
"item" "item"); 

INSERT INTO XML_TAB (XML_DATA) values (
xmltype("xml"(
    "item"(XML_TAB_SEQ.CURRVAL, dish_name, dish_type, dish_image)) 
    ) 
); 
+0

第一个像魅力一样工作,未测试接下来的两个。唯一的是你需要代码中的END。谢谢 – Ribeiro