如何在解码函数中使用Varray或游标或任何其他数组来比较值

时间:2013-12-03 06:57:03

标签: sql oracle plsql oracle10g plsqldeveloper

我想比较emp_x表中的last_name值,如果匹配任何记录,则前三个字符的名称列,然后我想从emp_x表返回该值。

以下是我的表格和记录:

select substr(x.last_name,1,3) from employee x;

Mathews
Smith
Rice
Black
Green
Larry
Cat

select * from emp_x;

Mataaa
Mmitta
Smitta
Riceeeee

Expected Result:
select decode(substr(x.last_name,1,3), substr(x.last_name,1,3), (select name from emp_x y where y.name like substr(x.last_name,1,3)||'%'),x.last_name) from employee x;

Mataaa
Smitta
Riceeeee
NULL
NULL
NULL
NULL

我得到了确切的结果,但是在pl / sql程序中还有其他最好的方法可以使用它。

比如说,我从employee表中获取'Mathews'last_name值并读取前3位数并在emp_x表中进行比较,并在上面的解码函数中获得Mataa值。

我们可以使用任何数组或游标来比较并从pl / SQL过程中的变量中获取值,而不是从表中选择值...

请帮忙解决此问题。

3 个答案:

答案 0 :(得分:1)

我知道这段代码不是最好的解决方案,它本质上是一种工作(ish)。无论如何我把它写成只是花了一些时间在工作上,我希望即使它不是完整的解决方案,你会对你想要达到的目标有所了解

DECLARE
CURSOR c1 IS select substr(x.last_name,1,3) from employee x;
c1_rec c1%ROWTYPE;
CURSOR c2 IS select * from emp_x;
c2_rec c2%ROWTYPE;
l_name employee.last_name%TYPE;
BEGIN
FOR c1_rec IN c1
LOOP
FOR c2_rec IN c2
LOOP
IF(c1_rec.last_name == c2_rec.name) THEN
SELECT last_name into l_name from EMPLOYEE where substr(last_name,1,3) = c1_rec.last_name;
dbms_output.put_line(l_name);
ELSE
dbms_output.put_line("NULL");
END IF; 
END LOOP;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line("exception occured");
END;

答案 1 :(得分:1)

我宁愿坚持这种做法:

SQL> with employee as
  2   (select 'Mathews' name from dual
  3    union all
  4    select 'Smith' from dual
  5    union all
  6    select 'Rice' from dual
  7    union all
  8    select 'Black' from dual
  9    union all
10    select 'Green' from dual
11    union all
12    select 'Larry' from dual
13    union all
14    select 'Cat' from dual),
15  emp_x as
16   (select 'Mataaa' pattern from dual
17    union all
18    select 'Mmitta' from dual
19    union all
20    select 'Smitta' from dual
21    union all
22    select 'Riceeeee' from dual)
23  select nvl(ex.pattern, 'NULL') result
24    from employee e
25    left outer join emp_x ex
26      on substr(ex.pattern, 1, 3) = substr(e.name, 1, 3);

RESULT
--------
Mataaa
Smitta
Riceeeee
NULL
NULL
NULL
NULL
7 rows selected

您没有提供有关表的大小的任何信息,但无论如何,此查询中的散列连接将比任何过程代码快得多。当然,如果您需要在某些过程中使用它,您可以将其包装在游标中:

for c1 in (select ...)
loop
 dbms_output.put_line(c1.result);
end loop;

答案 2 :(得分:0)

这可以用于使用游标比较集合:

声明

光标c1是

从empc中选择last_name ls;

type x是employees.last_name%type;

的表

x1 x:= x();

cnt integer:= 0;

开始

用于c1循环中的z

cnt:= cnt +1;

x1.extend;

x1(cnt):= z.ls;

如果x1(cnt)为NULL,那么

DBMS_OUTPUT.PUT_LINE( 'ASHISH');

结束if;

dbms_output.put_line(cnt ||''|| x1(cnt));

结束循环;

端;