【问题标题】:Does Oracle 11g2 support cursor for sem_match function?Oracle 11g2 是否支持 sem_match 函数的游标?
【发布时间】:2012-07-11 14:08:26
【问题描述】:

我试图通过在我在 Oracle 中创建的语义模型上运行与语义相关的 sql 来探索 Oracle 数据库的语义特性。但我不能让它工作,关于这方面的信息很少。

程序的功能很简单,从sparql查询中获取结果集。

CREATE OR REPLACE PROCEDURE PROC_MERGE_PATHWAY_SEM AS 
TYPE c_type IS REF CURSOR;
semCursor c_type;
p1 VARCHAR2(40);
p2 VARCHAR2(40);
interCount INTEGER;

BEGIN
OPEN semCursor FOR
 'SELECT p1, p2, COUNT(g) as interCount
  FROM TABLE (sem_match (
                  "{?p1 <http://example.com/test.owl#relates_to> ?g .  ?p2              <http://example.com/test.owl#relates_to> ?g }",
                      sem_models("pathway"),
                      null,
                      null,
                      null))';

LOOP
FETCH semCursor INTO p1, p2, interCount;
EXIT WHEN semCursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(p1||','||p2||','||interCount);
END LOOP; 

/*
FOR records IN semCursor LOOP
 DBMS_OUTPUT.PUT_LINE('test'); 
END LOOP; */
END PROC_MERGE_PATHWAY_SEM;

编译错误如下:

ORA-00972: 标识符太长

ORA-06512:在“SYSTEM.PROC_MERGE_PATHWAY_SEM”第 9 行

ORA-06512:在第 2 行

我不确定这是由游标语句包装的 sem_match 语法错误引起的,还是 Oracle 11g2 中的错误引起的?有人可以帮我解决这个问题吗?谢谢。

【问题讨论】:

  • 你真的需要 ' 在 select 语句周围的引号吗?
  • 如果我不加'引号,它会将两个Sparql查询语句视为一个完整的字符串,从而导致“标识符太长”错误。
  • 嗨 Mat,我知道我不应该在 select 语句周围加上 ' 引号,但我根据此页面 Thread: SEM_MATCH in Cursor causing error, ORA-22905 进行了更改,这只能使我的程序编译成功,但运行有提到的错误。

标签: oracle semantics owl


【解决方案1】:

您似乎在sem_match 调用中使用了双引号("),我认为您应该使用两个单引号('');您需要它,因为它已经在 open ... for 的单引号内。

(我可能应该注意到我从未使用过语义,但docs 表示单引号)。

双引号导致其中的整个字符串被视为文字标识符,因此出现错误消息。

但正如 Mat 评论的那样,您不需要在 select 周围加上单引号,因此您不需要转义 sem_match 中的单引号。

更新了以下 cmets:假设您确实需要将整个 select 包裹在单引号中,正如您链接到的文章所建议的那样,已经在命令中的单引号需要转义,这在 Oracle 中是通过同时使用两个单引号来完成的 ('');在看起来很像双引号(")的文章中,所以我可以理解您的困惑。根据您放入粘贴箱的代码:

create or replace
PROCEDURE PROC_MERGE_PATHWAY_SEM AS 
TYPE c_type IS REF CURSOR;
semCursor c_type;
p1 VARCHAR2(40);
p2 VARCHAR2(40);
interCount INTEGER;

BEGIN
  OPEN semCursor FOR
     'SELECT p1, p2, COUNT(g) as interCount
      FROM TABLE (sem_match (
                      ''{?p1 <http://example.com/test.owl#relates_to> ?g .  ?p2 <http://example.com/test.owl#relates_to> ?g }'',
                          sem_models(''pathway''),
                          null,
                          null,
                          null))';

   LOOP
   FETCH semCursor INTO p1, p2, interCount;
   EXIT WHEN semCursor%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(p1||','||p2||','||interCount); 
   END LOOP; 

 /*
  FOR records IN semCursor LOOP
    DBMS_OUTPUT.PUT_LINE('test'); 
  END LOOP; */
END PROC_MERGE_PATHWAY_SEM;

您在原始问题中的查询中的每个" 都被两个 单引号替换,因此sem_models("pathway") 变为sem_models(''pathway'')

【讨论】:

  • 如果我删除 ' 周围的 select 引号,将会出现“标识符太长”错误。如果我还将sem_match 函数中的" 引号更改为',则主要错误是“ORA-22905:无法访问非嵌套表项中的行”。
  • 您已经拥有 ORA-00972,因此删除 select 周围的 ' 似乎没有任何改变。 " 是错误的,只有在真正需要标识符周围(区分大小写时)时才使用它们。所以你真正的问题是 ORA-22905,另一个错误只是掩盖了......
  • 好的,所以根据你上面链接的文章,试试我先说的;在 select 周围保留外部单引号,但将双引号 (") 更改为两个单引号 ('')。我认为您只是误读了文章所说的内容(因为他们的代码不是等宽的)。我不确定为什么这会有所帮助,因为无论如何它都是动态的,但我想值得一试。
  • 嗨,Alex,我之前试过这个,但收到错误 Error(13,24): PLS-00103: Encountered the symbol "{" when expecting one of the following: * &amp; = - + ; &lt; / &gt; at in is mod remainder not rem &lt;an exponent (**)&gt; &lt;&gt; or != or ~= &gt;= &lt;= &lt;&gt; and or like like2 like4 likec between using || multiset member submultiset
  • @Peiqin - 用 两个 单引号代替每个双引号?该错误表明您只有一个...也许您可以准确地发布导致该错误的内容(在 Q 或 pastebin.com 或其他地方)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2019-01-29
相关资源
最近更新 更多