标识符太长异常

时间:2016-12-26 05:59:35

标签: oracle oracle11g plsqldeveloper

我有超过4000个字符的查询,这些字符由varchar2数据类型大小为2000的不同变量形成 例 query1 varcahr2(2000):='string 1'; query2 varchar2(2000):='string2'; query3 varcahr2 (2000):= string3';

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

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;

2 个答案:

答案 0 :(得分:0)

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

您可以查看 CLOB数据类型

答案 1 :(得分: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子句等,请确保最后有空格每个部分(或下一部分的开头),或者组合的字符串可能最终无效。