我试图通过在我在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中的错误引起的?有人可以帮我吗?感谢。
答案 0 :(得分:1)
您似乎在"
电话中使用双引号(sem_match
),我认为您应该使用两个单引号(''
);你需要它,因为它已经在open ... for
的单引号内。
(我应该注意到我从未使用过语义,但docs表示单引号。)
双引号导致其中的整个字符串被视为文字标识符,因此出现错误消息。
但正如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'')
。