标识符太长异常

Identifier Too long Exception

我有超过 4000 个字符的查询,这些字符由具有大小为 2000 的 varchar2 数据类型的不同变量组成 例子 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;

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

你可以看看CLOB数据类型

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

用单引号替换双引号:

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;

你不需要dual的查询,你可以这样做:

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' - 只需使用数字即可。您最终可能需要一个序列来设置该值。


也没有直接关系,但是当你将查询的各个部分连接在一起时,说一个字符串是 select 列表,第二个是 from 子句等,确保每个部分的末尾(或下一部分的开头)都有空格,否则组合字符串可能最终无效。