1

尽管我通过谷歌阅读了这个论坛和许多其他论坛,但我仍然遇到问题。也许有人可以给我一个提示。我必须在 oracle 10g 中创建一个提供Cursor结果的 ref 的过程。此结果可以通过参数过滤,该参数包含Stringxml 格式。

结构是

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

因为我不知道哪些列会被过滤,所以我将它动态连接起来,如下所示。但是由于 Sql Injection 的可能性,我想参数化过滤器部分。

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