2016-12-26 79 views
0

我具有由具有尺寸2000 示例的VARCHAR2数据类型不同varaibles query1 varcahr2(2000):='string 1'; query2 varchar2(2000):='string2'; query3 varcahr2 (2000):= string3';标识符太长异常

我已声明的变量查询VARCHAR2(32000) query := query1|| query2 || query3 ;

形成的超过4000个字符的查询

create table t ( id number, querystring varchar2(4000));

我试图从查询变量中得到前4000个字符,它不工作。任何人都可以帮忙吗?

declare 
    querystring1 varchar2(2000) := "string1"; 
    querystring2 varchar2(2000) := "string2"; 
    l_query varchar2(32000); 
    query varchar2(4000); 
begin 
    l_query := querystring1 || querystring2 ; 
    select substr(l_query,1,4000) into query from dual; 
    insert into lib_query_table values('1',query); 
end; 
+0

只是说一些'不工作'是没有用的。 *你是如何获得前4000个角色的?发生了什么 - 你得到了什么错误?字符串是否包含多字节字符? –

+0

'select substr(query,1,4000)from dual' – Mahi

+0

执行完这个查询后,我得到的标识符太长了。在我的应用程序中,我还查看了它没有将表插入记录的表,因为字符串包含超过4000字符 – Mahi

回答

0

你周围使用的查询字符串字面双引号,而不是单引号。这使Oracle将它们解释为标识符名称 - 因此,只要您的文字长度超过30个字符,您就会得到该异常。对于较短的字符串,您仍然会得到一个错误,但类似于“未知标识符”。

单更换成你的双引号:

declare 
    querystring1 varchar2(2000) := 'string1'; 
    querystring2 varchar2(2000) := 'string2'; 
    l_query varchar2(32000); 
    query varchar2(4000); 
begin 
    l_query := querystring1 || querystring2 ; 
    select substr(l_query,1,4000) into query from dual; 
    insert into lib_query_table values (1, query); 
end; 

你不需要从双查询,你可以这样做:

query := substr(l_query, 1, 4000); 

您可以跳过该变量,做:

insert into lib_query_table (id, querystring) 
values (1, substr(l_query, 1, 4000); 

甚至:

insert into lib_query_table (id, querystring) 
values (1, substr(querystring1 || querystring2, 1, 4000)); 

由于您的ID列是一个数字,您不应该将该值作为字符串插入'1' - 只需使用一个数字即可。最终,您可能需要一个序列来设置该值。


也没有直接关系,但是当你串联查询的若干部分,说其中一个字符串是选择列表和第二个是from条款等,请务必在最后有空白(或下一部分的开始),或者组合字符串可能最终失效。

+0

感谢亚历克斯它现在为我工作.. – Mahi

0

具有最大长度大小字节或字符的可变长度字符串。您必须为VARCHAR2指定大小。最小大小是1个字节或1个字符。最大大小为:32767字节或字符,如果MAX_STRING_SIZE = EXTENDED 4000字节或字符。

你可以看看CLOB数据类型