Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未在预期位置找到FROM关键字,文本选择Oracle SQL_Oracle_Concatenation_Clob - Fatal编程技术网

未在预期位置找到FROM关键字,文本选择Oracle SQL

未在预期位置找到FROM关键字,文本选择Oracle SQL,oracle,concatenation,clob,Oracle,Concatenation,Clob,我想生成一个表,其中包含子字符串和另一个表的ID,其中包含子字符串。见问题 表_表达式包含所需的子字符串 我的真实数据生成了大量要连接的ID。在使用真实数据运行代码后,返回错误01489。00000-字符串连接的结果太长 *原因:字符串连接结果超过最大大小。 *操作:确保结果小于最大大小。发生 如何重写代码以将生成的列ID格式化为CLOB格式? 我看了看问题,但我不明白贴出的答案中的代码 此代码: create table a_y as with input_strings ( a ) as

我想生成一个表,其中包含子字符串和另一个表的ID,其中包含子字符串。见问题

表_表达式包含所需的子字符串 我的真实数据生成了大量要连接的ID。在使用真实数据运行代码后,返回错误01489。00000-字符串连接的结果太长 *原因:字符串连接结果超过最大大小。 *操作:确保结果小于最大大小。发生

如何重写代码以将生成的列ID格式化为CLOB格式? 我看了看问题,但我不明白贴出的答案中的代码

此代码:

create table a_y
as
with
 input_strings ( a ) as (
   select a
   from table_expressions                    
 )
select   t2.a, RTRIM(XMLAGG(XMLELEMENT(E,t1.a,',').EXTRACT('//text()') ORDER BY t1.a).GetClobVal(),',') AS LIST as ids
from     a_x t1 
     join input_strings t2 on t1.a like '%' || t2.a || '%'
group by t2.a
;
根据未在预期位置找到的关键字生成错误。 我想生成一个表a_y,它应该是这样的,列a和列ID应该是clob格式:

A                            | IDs                                    
-----------------------------|-------
atveroeosipsum               | 1,3
test                         | 2
stetclitakasd                | 2
noseatakimata                | 3
loremipsumdolor              | 1,4
consetetursadipscingelitr    | 5

如何修复此问题?

立即出现的错误是由于将两个别名指定给连接的结果而导致的:您的AS LIST AS id。计算结果不能有两个别名。如果希望新创建的表具有列列表,请将其作为ID删除,反之亦然

然后您将遇到另一个错误:您正试图在聚合中按t1.a排序。那是行不通的;不能在XML聚合中按CLOB排序。你真的在乎聚合发生的顺序吗?如果没有,则按NULL更改为ORDER。如果您真的在意,您就有问题了,因为在Oracle中,order_by_子句根本不能按CLOB表达式排序。您必须创建一个单独的列,以便使用其他方法进行排序

在整个解决方案中,不需要WITH子句。只要在查询中引用WITH子句以外的输入字符串,只需编写表表达式即可

编辑

以下是如何使其发挥作用。首先,我将显示CREATETABLE语句。我将假设table_表达式有一列CLOB搜索字符串,并且该列中没有重复项。即使如此,表也需要一个单独的主键,其数据类型不是LOB或其他长的、非标准类型。我用这个号码

然后我按这个主键列进行聚合。唉,我不能同时选择搜索字符串。我可以选择MAXt2.a,但这对CLOB值也不起作用!相反,我需要进一步的连接来匹配主键和搜索字符串。抱歉,由于此原因,查询将花费更长的时间

在聚合中,我按照列a中字符串值的前4000个字符进行排序。这不如按整个输入字符串排序好,但仍比按NULL排序好

create table a_x ( a, b ) as
  select to_clob('atveroeosipsumloremipsumdolor'), 1 from dual union all
  select to_clob('stetclitakasdtest')            , 2 from dual union all
  select to_clob('noseatakimataatveroeosipsum')  , 3 from dual union all
  select to_clob('loremipsumdolor')              , 4 from dual union all
  select to_clob('consetetursadipscingelitr')    , 5 from dual
;

create table table_expressions ( a, pk ) as 
 select to_clob('atveroeosipsum') , 10 from dual union all 
 select to_clob('test') , 11 from dual union all 
 select to_clob('stetclitakasd') , 12 from dual union all 
 select to_clob('noseatakimata') , 13 from dual union all 
 select to_clob('loremipsumdolor') , 14 from dual union all 
 select to_clob('consetetursadipscingelitr'), 15 from dual 
 ;

create table a_y as
select te.a, s.ids
from   table_expressions te 
       join
       (select   t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.a,',').EXTRACT('//text()') 
                     ORDER BY cast(t1.a as varchar2(4000))).GetClobVal(),',') as ids
        from     a_x t1 
         join table_expressions t2 
          on t1.a like '%' || t2.a || '%'
         group by t2.pk
       ) s
on te.pk = s.pk
;
现在让我们检查一下我们得到了什么:

select * from a_y;

A                          IDS
-------------------------  ---------------------------------------------------------
atveroeosipsum             atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test                       stetclitakasdtest
stetclitakasd              stetclitakasdtest
noseatakimata              noseatakimataatveroeosipsum
loremipsumdolor            atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr  consetetursadipscingelitr
编辑2

如果需要连接表a_x列b中的id,而不是CLOB本身,则用t1.b替换t1.a,并且在XMLAGG的ORDER BY子句中,不需要任何强制转换,只需按t1.b排序即可


我修改了代码:创建表a_y as,输入字符串a as select a from table_expressions select t2.a,rtrimxmlaggxmlemente,t1.a,','。按NULL.GetClobVal提取'//text'顺序,'as id from a_x t1 join table_expressions t2 on t1.a,类似于“%”t2.a | |“%”按t2.a;分组;。数据类型不一致时出错:应为%s获得%s。我不明白。您可以省略输入字符串作为从表中选择表达式,因为它不再需要了。但这一不必要的WITH子句并不是错误的原因。错误消息应该准确地告诉您它发生在哪里-是吗?什么路线和位置。也许以一种不明显的方式,类似于Error13:48的东西意味着第13行,这行代码的第48个字符。现在我将其更改为:创建表a_y作为select t2.a,RTRIMXMLAGGXMLELEMENTE,t1.a,','.EXTRACT'//text'ORDER BY NULL.GetClobVal,','as id from a_x t1 join table_expressions t2 on t1.a,类似于“%”t2.a | |“%”按t2.a;分组;。错误所指的是t2.a的线组。无法分组吗?是的,我有一个主键,我更改了表以创建表table_表达式a clob,PK varchar24000;将全部插入表_表达式a,pk值“atveroeosipsum”,1插入表_表达式a,pk值“test”,2插入表_表达式a,pk值“stetclitakasd”,3插入表_表达式a,pk值“nosatakimata”,4插入表_表达式a,pk值“loremipsumdolor”,5插入表_表达式a,pk值'ConseteTursAdipscingiletr',6从双重选择中选择*;错误仍然存在。我想我有一个解决方法,我会在上面的答案中发布。表_表达式中的字符串片段必须是CLOB吗?它们应该是长度不超过4000个字符的相对较短的字符串,这似乎是有道理的 比那还要长。实际数据的列以CLOB表示。
select * from a_y;

A                          IDS
-------------------------  ---------------------------------------------------------
atveroeosipsum             atveroeosipsumloremipsumdolor,noseatakimataatveroeosipsum
test                       stetclitakasdtest
stetclitakasd              stetclitakasdtest
noseatakimata              noseatakimataatveroeosipsum
loremipsumdolor            atveroeosipsumloremipsumdolor,loremipsumdolor
consetetursadipscingelitr  consetetursadipscingelitr
drop table a_y purge;

create table a_y as
select te.a, s.ids
from   table_expressions te 
       join
       (select   t2.pk, RTRIM(XMLAGG(XMLELEMENT(E,t1.b,',').EXTRACT('//text()') 
                     ORDER BY t1.b).GetClobVal(),',') as ids
        from     a_x t1 
         join table_expressions t2 
          on t1.a like '%' || t2.a || '%'
         group by t2.pk
       ) s
on te.pk = s.pk
;

select * from a_y;

A                          IDS
-------------------------  ---
atveroeosipsum             1,3
test                       2
stetclitakasd              2
noseatakimata              3
loremipsumdolor            1,4
consetetursadipscingelitr  5