1
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 クエリでこれを使用しましたが、null 値をチェックできません。どうすればよいか混乱しています。

編集

私が試したのは、リスト v_pk_key をに変換することでした

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

select v_pk_list from emp_test where empno=p_empno; 

結果に $ がない場合は、結果の $ をチェックします。複数の行をチェックしますが、これを効率的な解決策として見つけていません

誰かが私にそれを教えてくれたら、私はこれを解決します。

4

1 に答える 1

1

実際には 3 つの列 ('empno, ename, job') を表す値のリストを分割します。instr 関数を使用するか、別の関数を作成して pl/sql テーブルを分割して返しますが、どちらの方法でもコードの意図がより明確になります。

instr を使用して csv フィールドを分割するいくつかの例へのSO リンクについては、こちらを参照してください。

これらの値 (l_empno、l_ename、l_job) を持つ 3 つの個別のローカル変数を取得すると、さまざまな SQL ステートメント (l_empno = blah および l_ename が (blahblah) にない) などでより簡単に使用できるようになります。

于 2012-03-08T17:22:17.790 に答える