Tôi đã một stored procedure mà chấp nhận nhiều thông số (ví dụ pName, pHeight, pTeam)thông số Binding để Oracle SQL động
Tôi có truy vấn xây dựng như thế này:
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;
Nếu tôi thực hiện thủ tục chuyển tất cả các tham số, nó chạy đúng cách.
Nhưng nếu tôi chỉ thông qua một hoặc hai trong số các thông số, sau đó các lỗi thủ tục ra:
ORA-01006: bind variable does not exist
Làm thế nào để chọn lọc ràng buộc biến với các thông số dựa trên nơi giá trị tham số được sử dụng? Ví dụ, nếu chỉ pName được thông qua, sau đó tôi sẽ chỉ thực hiện truy vấn:
OPEN TestCursor FOR SQLQuery USING pName;
Hoặc nếu cả hai pName và pTeam được thông qua, sau đó:
OPEN TestCursor FOR SQLQuery USING pName, pTeam;
Hope ai đó có thể đổ nhiều cách để giải quyết điều này. Cảm ơn.
Edit: tôi thực sự có thể sử dụng như sau:
- Xây dựng các truy vấn dựa trên các thông số thông qua. NẾU pName KHÔNG phải là NULL SQLQuery: = SQLQuery || 'VÀ Tên NHƯ' '' || 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;
Nhưng điều này sẽ rất dễ bị SQL Injection ...
T_binds được khai báo ở đâu? Hay tôi cần khai báo ở đâu đó? – Batuta
Nó được khai báo trong mệnh đề 'WITH' trong câu lệnh SQL, nó là một bảng giả để giữ các biến liên kết. Xem tại đây: http://www.orafaq.com/node/1879 – Ollie
Đã thử điều này nhưng vẫn nói ORA-01008: không phải tất cả các biến bị ràng buộc – Batuta