столбец таблицы, содержащий список других столбцов таблицы - PullRequest
1 голос
/ 08 марта 2012
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_key как empno||ename||job и затем использовал это в запросе выбора, но не в состоянии проверить на нулевые значения, я запутался, что делать.

РЕДАКТИРОВАТЬ

что яЯ пытался преобразовать список v_pk_key в

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

select v_pk_list from emp_test where empno=p_empno; 

, а затем проверить на $ в результате, если в результате нет $, я проверю более одной строки, ноя не считаю это эффективным решением

если кто-нибудь подскажет мне об этом, я это решу.

1 Ответ

1 голос
/ 08 марта 2012

Я бы выделил этот список значений, который на самом деле представляет собой 3 столбца («empno, ename, job»).Используйте функцию instr или создайте отдельную функцию для разделения и возврата таблицы pl / sql, но в любом случае было бы намного более понятно, что предназначено в коде.

См. Здесь ссылку SO к некоторым примерам, использующим instr для разделения полей csv.

Если у вас есть 3 отдельные локальные переменные с этими значениями (l_empno, l_ename, l_job), то вы можете использовать намного проще в различных SQL-выражениях (гдеl_empno = бла и l_ename не в (бла-бла)), и т.д ...

...