2012-07-11 50 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

相關問題