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