表列包含其他表列的列表

时间:2012-03-08 16:24:43

标签: oracle plsql oracle11gr2

create table cdi(comp_id varchar2(3),pk_key varchar2(2000));
insert into cdi values('abc','empno,ename,job');
insert into cdi values('pqr','empno,job,mgr');
insert into cdi values('cde','empno,mgr,sal');
commit;

create table emp_test(empno integer,ename varchar2(200),job varchar2(200),mrg  integer,sal integer);
insert into emp_test values(1,'Gaurav Soni','DB',12,12000);
insert into emp_test values(2,'Niharika Saraf','Law',13,12000);
insert into emp_test values(2,'Niharika Saraf','Law',13,12000);
insert into emp_test values(3,'Saurabh Soni',null,12,12000);
commit;

cdi表中comp_id是主键

create or replace procedure test(p_comp_id IN cdi.comp_id%TYPE
                            ,p_empno   IN emp_test.empno%TYPE
                            )
IS
TYPE ref_cur is ref cursor;
v_cur ref_cur;
v_pk_key cdi.pk_key%TYPE;


BEGIN
  OPEN v_cur is select pk_key from cdi where comp_id =p_comp_id;
  fetch v_cur into v_pk_key;

 --now this list v_pk_key is primary key for that comp_id
 --so following things need to be done 
 --1.check the emp_test table with this column list (v_pk_key )
 --2. whether for that emp_no the primary key is null eg.
   -- incase of comp_id cde ...empno,mgr,sal  value should be not null
   --if any of the value is null raise an error 
 --3.If there are two rows for that primary also raise an error.
   -- for eg comp_id=abc  two rows are fetched from emp_test 
 close v_cur;
END;

我不知道该怎样做我应该做什么,首先我想联接v_pk_keyempno||ename||job然后在select查询中使用它,但不能检查空值,我很困惑该怎么做。

修改

  

我试过的是将列表v_pk_key转换为

NVL(empno,'$')||NVL(ename,'$')||NVL(job,'$') and then

select v_pk_list from emp_test where empno=p_empno; 
  

然后检查结果中的$如果结果中没有$我将检查多行,但我发现这不是一个有效的解决方案

     
    

如果有人给我一个jist,我会解决这个问题。

  

1 个答案:

答案 0 :(得分:1)

我会拆分那个值列表,它真正代表3列('empno,ename,job')。使用instr函数,或创建一个单独的函数来拆分和返回一个pl / sql表,但无论哪种方式,它都会更清楚代码中的内容。

有关使用instr分割csv字段的一些示例,请参阅此处SO link

一旦你有3个单独的局部变量与这些值(l_empno,l_ename,l_job),那么你可以在各种SQL语句中使用更容易(其中l_empno = blah和l_ename不在(blahblah))等等...