मैं एक संग्रहीत प्रक्रिया है कि एक से अधिक पैरामीटर (यानी pName, pHeight, pTeam) स्वीकार करता हैबाध्यकारी पैरामीटर
मैं क्वेरी इस तरह का निर्माण किया है:
SQLQuery VARCHAR2(6000);
TestCursor T_CURSOR;
SQLQuery := 'SELECT ID, Name, Height, Team FROM MyTable WHERE ID IS NOT NULL ';
-- Build the query based on the parameters passed.
IF pName IS NOT NULL
SQLQuery := SQLQuery || 'AND Name LIKE :pName ';
END IF;
IF pHeight IS > 0
SQLQuery := SQLQuery || 'AND Height = :pHeight ';
END IF;
IF pTeam IS NOT NULL
SQLQuery := SQLQuery || 'AND Team LIKE :pTeam ';
END IF;
OPEN TestCursor FOR SQLQuery USING pName, pHeight, pTeam;
मैं निष्पादित हैं सभी मानकों को पार करने की प्रक्रिया, यह ठीक से चलता है।
लेकिन अगर मैं केवल एक या, मापदंडों के दो तो प्रक्रिया त्रुटियों बेहोश हो गए:
ORA-01006: bind variable does not exist
मैं चुनिंदा जहां पैरामीटर मान इस्तेमाल किया गया था के आधार पर मानकों के साथ चर बाध्य करते हैं?
OPEN TestCursor FOR SQLQuery USING pName;
या अगर दोनों pName और pTeam पारित किया गया था, तो:
OPEN TestCursor FOR SQLQuery USING pName, pTeam;
आशा किसी को अधिक तरीकों शेड कर सकते हैं हल करने के लिए उदाहरण के लिए, अगर केवल pName पारित किया गया था, तो मैं केवल क्वेरी निष्पादित होगा इस। धन्यवाद।
संपादित करें: मैं वास्तव में निम्नलिखित इस्तेमाल कर सकते हैं:
- मापदंडों के आधार पर पारित कर दिया क्वेरी बनाएँ। यदि पीएनएएम पूर्ण नहीं है SQLQuery: = SQLQuery || 'और नाम पसंद' '' || पीएनएएम || '' ''; अंत IF;
IF pHeight IS > 0
SQLQuery := SQLQuery || 'AND Height = pHeight ';
END IF;
IF pTeam IS NOT NULL
SQLQuery := SQLQuery || 'AND Team LIKE ''' || pTeam || ''' ';
END IF;
OPEN TestCursor FOR SQLQuery;
लेकिन यह बहुत SQL इंजेक्शन से कमजोर पड़ जाती ...
t_binds कहां घोषित किया गया था? या मुझे इसे कहीं घोषित करने की ज़रूरत है? – Batuta
यह एसक्यूएल कथन में 'इन' खंड में घोषित किया गया है, यह बाध्य चर को पकड़ने के लिए एक डमी टेबल है। यहां देखें: http://www.orafaq.com/node/1879 – Ollie
यह कोशिश की लेकिन अभी भी ओआरए -01008 कहता है: – Batuta