3
下面是当程序运行时通过给P_LOC赋值为'DALLAS' 它给出的错误为-904 ORA-00904:“DALLAS”:请使用无效标识符提供一种解决方案oracle plsql将一个变量连接到一个字符串
create or replace
PROCEDURE PR_EMP_LST1
(P_LOC IN VARCHAR2
, P_MIN_SAL IN NUMBER
, P_MAX_SAL IN NUMBER
, P_REF_CUR OUT SYS_REFCURSOR
) AS
TYPE TY_LST_REFCURSOR IS REF CURSOR ;
cur_emp_lst TY_LST_REFCURSOR;
v_inv_query VARCHAR2(2000);
V_USG_CL VARCHAR2(200);
BEGIN
IF P_LOC IS NULL AND p_min_sal IS NULL AND p_max_sal IS NULL THEN
v_inv_query :='SELECT ENAME
FROM EMP ';
ELSE
v_inv_query :='SELECT ENAME
FROM EMP WHERE ';
IF P_LOC IS NULL AND p_min_sal IS NOT NULL AND p_max_sal IS NOT NULL THEN
v_inv_query :=v_inv_query ||' SAL BETWEEN '
||p_min_sal
||' AND '
|| p_max_sal;
-- v_inv_query :=v_inv_query ||' SAL BETWEEN :1 AND :2 ';
dbms_output.put_line('2');
-- V_USG_CL:= ' USING '||p_min_sal||' , '|| p_max_sal;
ELSIF P_LOC IS NOT NULL AND p_min_sal IS NOT NULL AND p_max_sal IS NOT NULL THEN
dbms_output.put_line('1');
v_inv_query :=v_inv_query||' SAL BETWEEN '
||p_min_sal || ' AND '|| p_max_sal
|| ' AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC= '
|| p_loc
||')';
dbms_output.put_line('2');
ELSIF P_LOC IS NOT NULL AND p_min_sal IS NULL AND p_max_sal IS NOT NULL THEN
v_inv_query :=v_inv_query||' SAL <= '
||p_max_sal
||' AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC= '
|| p_loc
||')';
ELSIF P_LOC IS NOT NULL AND p_min_sal IS NOT NULL AND p_max_sal IS NULL THEN
v_inv_query :=v_inv_query||' SAL >= '
||p_min_sal
||' AND DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC= '
||p_loc
||')';
ELSIF P_LOC IS NULL AND p_min_sal IS NULL AND p_max_sal IS NOT NULL THEN
v_inv_query :=v_inv_query||' SAL <= '
||p_max_sal;
ELSIF P_LOC IS NULL AND p_min_sal IS NOT NULL AND p_max_sal IS NULL THEN
v_inv_query :=v_inv_query||' SAL >= '
|| p_min_sal;
ELSIF P_LOC IS NOT NULL AND p_min_sal IS NULL AND p_max_sal IS NULL THEN
v_inv_query :=v_inv_query||' DEPTNO IN (SELECT DEPTNO
FROM DEPT
WHERE LOC= '
||p_loc
||')';
END IF;
END IF;
dbms_output.put_line('3');
dbms_output.put_line(v_inv_query);
OPEN cur_emp_lst FOR v_inv_query ;
dbms_output.put_line('4');
P_REF_CUR:=cur_emp_lst;
END PR_EMP_LST1;
它不工作,这次它将p_loc作为'p_loc' – Bhagwat 2011-03-16 10:31:51
p_loc是什么内容?是DALLAS(p_loc ='DALLAS')还是'DALLAS'(p_loc ='''DALLAS''')。如果是DALLAS,则v_inv_query:= v_inv_query ||' SAL BETWEEN' || p_min_sal || 'AND'|| p_max_sal || 'AND DEPTNO IN(SELECT DEPTNO FROM DEPT where LOC =''' || p_loc ||''')';应该管用。字符串内''的意思是'。 – HamoriZ 2011-03-16 11:22:57
感谢您的工作精细可以吗?请解释为什么它应该这样 – Bhagwat 2011-03-17 13:47:26