1

このフォーラムや他の多くのフォーラムを Google 経由で読みましたが、まだ問題があります。多分誰かが私にヒントを与えることができます。結果を参照に提供するプロシージャをOracle 10gで作成する必要がありCursorます。Stringこの結果は、xml 形式の を含むパラメータでフィルタリングできます。

構造は

 <filter>
    <columnNameToSearch>
       SearchValue
    </columnNameToSearch>
 </filter>

どの列がフィルタリングされるかわからないため、以下に示すように動的に連結しました。しかし、Sql インジェクションの可能性があるため、フィルター部分をパラメーター化したいと思います。

CREATE OR REPLACE PROCEDURE TEST_GET_VALUES(p_recordset OUT SYS_REFCURSOR,    
p_xml    IN VARCHAR2 DEFAULT '<filter />')
AS
p_roleId ROLES.ROLE_ID%TYPE;
p_xmlDocument dbms_xmldom.DOMDocument;
p_xmlNode dbms_xmldom.DOMNode;
p_filterNodes dbms_xmldom.DOMNodeList;
p_nodeName          VARCHAR2(50);
p_nodeValue         VARCHAR2(50);
p_filterNodesLength NUMBER;
p_sqlStatement      VARCHAR2(4000);
p_filterStatement   VARCHAR2(4000);
BEGIN
p_xmlDocument := dbms_xmldom.newDOMDocument(XMLTYPE(p_xml));
p_xmlNode     := dbms_xmldom.makeNode(dbms_xmldom.getDocumentElement(p_xmlDocument));
p_filterNodes       := dbms_xmldom.getChildNodes(p_xmlNode);
p_filterNodesLength := DBMS_XMLDOM.getLength(p_filterNodes);
FOR i               IN 0 .. p_filterNodesLength - 1
LOOP
p_xmlNode   := DBMS_XMLDOM.item(p_filterNodes, i);
p_nodeName  := DBMS_XMLDOM.getNodeName(p_xmlNode);
p_nodeValue := DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(p_xmlNode));
p_filterStatement := p_filterStatement || ' AND ' || p_nodeName || ' = ' || p_nodeValue;
END LOOP;

p_sqlStatement := 'SELECT firstname, lastname, phone FROM myTable WHERE 1 = 1 ' || p_filterStatement;
OPEN p_recordset FOR p_sqlStatement;
END TEST_GET_VALUES;

dbms_sql パッケージを使用してみましたが、動作しませんでした。誰かが私に例を提供したり、何をすべきかのヒントを教えてくれるかもしれません。

4

0 に答える 0