1

我试图通过在我在 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 中的错误引起的?有人可以帮我解决这个问题吗?谢谢。

4

1 回答 1

1

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

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

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

但是正如 Mat 评论的那样,您不需要 . 周围的单引号select,因此您不需要转义sem_match.

更新了以下评论:假设您确实需要将整个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'').

于 2012-07-11T22:39:16.443 回答