2012-07-11 47 views
1

我试图通过在Oracle中创建的语义模型上运行语义相关的SQL来探索Oracle数据库的语义特性。但我无法做到这一点,并且关于这方面的信息很少。Oracle 11g2是否支持用于sem_match函数的游标?

该过程的功能很简单,可以从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中的错误引起的?有人可以帮助我吗?谢谢。

+0

你真的需要围绕select语句的引号吗? – Mat 2012-07-11 21:08:39

+0

如果我不放''引号,它将两个Sparql查询语句视为一个整体字符串,这会导致“标识符太长”错误。 – Peiqin 2012-07-12 14:40:06

+0

嗨,马特,我知道我不应该把'''引号围绕select语句,但我根据这个页面做了修改[线程:SEM_MATCH导致错误,ORA-22905](https://forums.oracle。 com/forums/thread.jspa?messageID = 4561450),它只能让我的程序成功编译,但运行时会出现上述错误。 – Peiqin 2012-07-12 14:45:10

回答

1

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

(我也许应该注意到我从来没有使用语义,但docs表示单引号)。

双引号引起其中的整个字符串被视为字面标识符,因此是错误消息。

但是正如Mat评论的那样,你不需要围绕select单引号,所以你不需要转义那些在sem_match

更新如下意见:假设你需要整个select包裹在单引号为您链接到建议,那些已经命令里面的单引号需要使用转义,这在甲骨文完成的文章两个单引号合起来('');在看起来很像双引号(")的文章中,所以我可以理解你的困惑。根据你的代码放在贴斌:

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'')

+0

如果我删除'select'周围的'''引号,则会出现“标识符太长”的错误。如果我还将'sem_match'函数中的''引号改为''',则主要错误是“ORA-22905:无法访问非嵌套表项中的行” – Peiqin 2012-07-12 14:42:04

+0

您已经有ORA-00972,所以删除'select'周围的'''似乎没有改变任何东西。'''只是错误的,你只有在确实需要围绕标识符时才使用它们(当区分大小写时)。所以你真正的问题是ORA-22905,另一个错误只是掩盖了... – 2012-07-12 14:48:26

+0

好的,所以根据您链接到上面的文章,请尝试我先说的;在'select'周围留下单引号,但将双引号('“')更改为两个单引号('''')。我认为你只是误解了文章的内容(因为他们的代码没有等宽)。我不知道为什么这会有帮助,因为它是动态的,但我猜是值得的。 – 2012-07-12 14:52:34

相关问题