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構文エラーが原因なのか、Oracle11g2のバグが原因なのかわかりません。誰かがこれを手伝ってくれませんか?ありがとう。

4

1 に答える 1

1

呼び出しで二重引用符(")を使用しているようですが、2つの一重引用符( )sem_matchを使用する必要があると思います。''からの単一引用符の中にすでに含まれているため、これが必要ですopen ... for

(私はセマンティクスを使用したことがないことに注意する必要がありますが、ドキュメントには一重引用符が示されています)。

二重引用符を使用すると、その中の文字列全体がリテラル識別子として扱われるため、エラーメッセージが表示されます。

しかし、Matがコメントしたように、の周りに一重引用符は必要selectないので、でそれらをエスケープする必要はありませんsem_match

次のコメントを更新select:リンク先の記事が示唆するように、全体を一重引用符で囲む必要があると仮定すると、コマンド内にすでに含まれていた一重引用符をエスケープする必要があります。これは、Oracleでは2つの一重引用符を一緒に使用して行われます( ''); 代わりに二重引用符()のように見えた記事で、"あなたの混乱を理解することができます。ペーストビンに入れたコードに基づいて:

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;

"元の質問のクエリで使用したものはそれぞれ、2つの一重引用符に置き換えられるため、にsem_models("pathway")なりsem_models(''pathway'')ます。

于 2012-07-11T22:39:16.443 に答える