このフォーラムや他の多くのフォーラムを 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 パッケージを使用してみましたが、動作しませんでした。誰かが私に例を提供したり、何をすべきかのヒントを教えてくれるかもしれません。