Dyanamic Query, передав строку в качестве условия для проверки
Это моя процедура:
PROCEDURE SP_SALARYADVANCE_RPT_TEST
(
txtExtraQuery IN STRING,
refcur OUT sys_refcursor )
OPEN refcur FOR
SELECT DISTINCT( SAL.ADVANCENO ), SALARYADVANCEID, SAL.TRANSDATE, SAL.APPROVEDREMARKS, SAL.APPROVEDAMOUNT, SAL.PAYRECAMOUNT, EMP.EMPLOYEENAME, EMP.EMPLOYEECODE
FROM HRM_SALARYADVANCE SAL, HRM_EMPLOYEE EMP, HRM_EMPLOYEEDEPARTMENTS DEPTS
WHERE SAL.EMPLOYEEID = EMP.EMPLOYEEID AND
SAL.EMPLOYEEID = DEPTS.EMPLOYEEID AND
DEPTS.DEPARTMENTID = txtdeptid || txtextraquery;
Вот моя проблема, я посылаю AND SAL.STATUS in (1,2,3)
в качестве параметра Это 1,2,3 может измениться, я хочу передать его из самого интерфейса.
При исключении этого запроса я получаю и ошибку
ORA-01722: неверный номер
1 ответ
Я предполагаю, что ваш "параметр" AND SAL.STATUS in (1, 2, 3)
помещается в txtExtraQuery
, Конечно, вы не можете объединить это с существующим запросом, как вы это сделали, потому что тогда вы объедините txtdeptid
с txtextraquery
, И это не имеет никакого значения. Вот почему вы получаете ORA-01722
ошибка при сравнении с DEPTS.DEPARTMENTID
Что вы хотите сделать, это запустить EXECUTE IMMEDIATE
команда. Проверьте эти ссылки:
- http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/executeimmediate_statement.htm
- http://www.dba-oracle.com/t_execute_dynamic_pl_sql_procedures.htm
Но, с другой стороны, я думаю, что вы должны изменить дизайн вашей процедуры. Это выглядит не очень хорошо. Почему бы не пройти VARRAY
или какой-то другой UDT
к вашей процедуре?