2017-04-11 212 views
0

请参阅下面的SQL,预期其工作原理:DBMS_XMLGEN.GETXMLTYPE与绑定变量

SELECT '<System1 MAPPINGID="13" URN="2441">' || DBMS_XMLGEN.GETXMLTYPE ('SELECT * from image_data where IMAGE_DATA.DATE_CREATED >= TO_DATE(''2016-01-01'', ''YYYY-MM-DD'') 
AND IMAGE_DATA.DATE_CREATED <= TO_DATE(''2017-01-01'', ''YYYY-MM-DD'') ').EXTRACT ('ROWSET/ROW/*').GETCLOBVAL() || 
'</System1>'AS XMLRETURNED FROM DUAL; 

我再添加参数是这样的:

variable DATE_CREATEDMOSTRECENT1 varchar(1000) 
exec :DATE_CREATEDMOSTRECENT1 :='2016-01-01'; 
variable DATE_CREATEDMOSTRECENT2 varchar(1000) 
exec :DATE_CREATEDMOSTRECENT2 :='2017-01-01'; 

SELECT '<System1 MAPPINGID="13" URN="2441">' || DBMS_XMLGEN.GETXMLTYPE ('SELECT * from image_data where IMAGE_DATA.DATE_CREATED >= TO_DATE(:DATE_CREATEDMOSTRECENT1, ''YYYY-MM-DD'') 
AND IMAGE_DATA.DATE_CREATED <= TO_DATE(:DATE_CREATEDMOSTRECENT2, ''YYYY-MM-DD'') ').EXTRACT ('ROWSET/ROW/*').GETCLOBVAL() || 
'</System1>'AS XMLRETURNED FROM DUAL; 

有一个与第二个SQL错误声明说参数没有被声明。问题是什么?

回答

0

变量声明的两个生产,在SQL * Plus和SQL Developer中,出现错误:

Usage: VAR[IABLE] [ <variable> [ NUMBER | CHAR | CHAR (n [CHAR|BYTE]) | 
        VARCHAR2 (n [CHAR|BYTE]) | NCHAR | NCHAR (n) | 
        NVARCHAR2 (n) | CLOB | NCLOB | BLOB | BFILE 
        REFCURSOR | BINARY_FLOAT | BINARY_DOUBLE ] ] 

不能使用VARCHAR

variable DATE_CREATEDMOSTRECENT1 varchar2(1000) 
exec :DATE_CREATEDMOSTRECENT1 :='2016-01-01'; 

PL/SQL procedure successfully completed. 

variable DATE_CREATEDMOSTRECENT2 varchar2(1000) 
exec :DATE_CREATEDMOSTRECENT2 :='2017-01-01'; 

PL/SQL procedure successfully completed. 

你现在还有你的绑定变量嵌入字符串文字,所以他们不会被解释;您需要连接绑定:

SELECT '<System1 MAPPINGID="13" URN="2441">' 
    || DBMS_XMLGEN.GETXMLTYPE ('SELECT * from image_data where IMAGE_DATA.DATE_CREATED >= TO_DATE(''' 
    || :DATE_CREATEDMOSTRECENT1 || ''', ''YYYY-MM-DD'') AND IMAGE_DATA.DATE_CREATED <= TO_DATE(''' 
    || :DATE_CREATEDMOSTRECENT2 || ''', ''YYYY-MM-DD'') ').EXTRACT ('ROWSET/ROW/*').GETCLOBVAL() 
    || '</System1>'AS XMLRETURNED FROM DUAL; 

在绑定字符串周围还带有额外的封闭(转义)单引号。