PL/SQL 过程、游标、where 子句
PL/SQL procedure, cursor, where clause
我有一些包含客户 ID、姓名、姓氏的数据库。我用一些参数制作了过程,其中包括带参数的游标。我想用那个光标显示客户姓名、姓氏、身份证。我想表明,在我调用过程的地方,例如我在过程中写为参数,例如 NULL NULL,它会显示所有记录。接下来,如果我写 NULL,Surname,它会显示带有该姓氏的记录。如果我写 firstname,NULL,它只显示记录有那个名字的记录,如果我写 Firstname,lastname,它只显示匹配这个的记录。所以我的程序工作正常,但我需要正确的 where 子句 n 游标。这是我的光标
CREATE OR REPLACE PROCEDURE test_two(c_f_name VARCHAR2,c_l_name VARCHAR2) IS
CURSOR c2(f_name VARCHAR2,l_name VARCHAR2) IS
SELECT cus_id,cus_l_name,cus_f_name
FROM CUSTOMER
WHERE (cus_f_name IS NOT NULL AND (cus_f_name = f_name orcus_l_name
IS NULL))
AND (cus_l_name IS NOT NULL AND (cus_l_name = l_name or cus_f_name IS
NULL));
v_complex c2%ROWTYPE;
lv_show VARCHAR2(20);
f_name VARCHAR2(20) := c_f_name;
l_name VARCHAR2(20) := c_l_name;
BEGIN
open c2(f_name,l_name);
LOOP
FETCH c2 INTO v_complex;
dbms_output.put_line(v_complex.cus_id|| ' ' ||v_complex.cus_f_name|| ' '
||v_complex.cus_l_name);
EXIT WHEN c2%NOTFOUND;
END LOOP;
CLOSE c2;
END;
该程序中的一切都是 IFNE,但我只需要 RIGHT WHERE 条款!谢谢
您可以使用 LIKE
和 NVL
的组合。
WHERE cus_f_name LIKE NVL(c_f_name, '%')
AND cus_l_name LIKE NVL(c_l_name, '%');
解释:
函数NVL
returns第一个参数如果不是NULL
。
否则它 returns 第二个参数。
我有一些包含客户 ID、姓名、姓氏的数据库。我用一些参数制作了过程,其中包括带参数的游标。我想用那个光标显示客户姓名、姓氏、身份证。我想表明,在我调用过程的地方,例如我在过程中写为参数,例如 NULL NULL,它会显示所有记录。接下来,如果我写 NULL,Surname,它会显示带有该姓氏的记录。如果我写 firstname,NULL,它只显示记录有那个名字的记录,如果我写 Firstname,lastname,它只显示匹配这个的记录。所以我的程序工作正常,但我需要正确的 where 子句 n 游标。这是我的光标
CREATE OR REPLACE PROCEDURE test_two(c_f_name VARCHAR2,c_l_name VARCHAR2) IS
CURSOR c2(f_name VARCHAR2,l_name VARCHAR2) IS
SELECT cus_id,cus_l_name,cus_f_name
FROM CUSTOMER
WHERE (cus_f_name IS NOT NULL AND (cus_f_name = f_name orcus_l_name
IS NULL))
AND (cus_l_name IS NOT NULL AND (cus_l_name = l_name or cus_f_name IS
NULL));
v_complex c2%ROWTYPE;
lv_show VARCHAR2(20);
f_name VARCHAR2(20) := c_f_name;
l_name VARCHAR2(20) := c_l_name;
BEGIN
open c2(f_name,l_name);
LOOP
FETCH c2 INTO v_complex;
dbms_output.put_line(v_complex.cus_id|| ' ' ||v_complex.cus_f_name|| ' '
||v_complex.cus_l_name);
EXIT WHEN c2%NOTFOUND;
END LOOP;
CLOSE c2;
END;
该程序中的一切都是 IFNE,但我只需要 RIGHT WHERE 条款!谢谢
您可以使用 LIKE
和 NVL
的组合。
WHERE cus_f_name LIKE NVL(c_f_name, '%')
AND cus_l_name LIKE NVL(c_l_name, '%');
解释:
函数NVL
returns第一个参数如果不是NULL
。
否则它 returns 第二个参数。