Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 包含其他表列列表的表列_Oracle_Plsql_Oracle11gr2 - Fatal编程技术网

Oracle 包含其他表列列表的表列

Oracle 包含其他表列列表的表列,oracle,plsql,oracle11gr2,Oracle,Plsql,Oracle11gr2,在cdi表中comp\u id是主键 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_t

cdi
表中
comp\u id
是主键

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;
我不确定该怎么做,首先我想到将
v|u pk|u键
empno | ename | job
连接起来,然后在select查询中使用它,但无法检查空值,我不知道该怎么做

编辑

我尝试的是将list v_pk_键转换为

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

如果有人告诉我,我会解决这个问题


我将拆分出这个值列表,它实际上代表3列(“empno、ename、job”)。使用instr函数,或者创建一个单独的函数来拆分并返回pl/sql表,但无论哪种方式,代码中的意图都会更加明确

有关使用instr拆分csv字段的一些示例,请参见此处


一旦有了3个单独的局部变量和这些值(l_empno、l_ename、l_job),那么在各种SQL语句(其中l_empno=blah和l_ename not in(blahblah))中使用起来就容易多了。

。使用instr函数,或者创建一个单独的函数来拆分并返回pl/sql表,但无论哪种方式,代码中的意图都会更加明确

有关使用instr拆分csv字段的一些示例,请参见此处



一旦你有了3个单独的局部变量和这些值(l_empno、l_ename、l_job),那么你就可以在各种SQL语句中更容易地使用它们(其中l_empno=blah和l_ename not in(blahblah)),等等。

当然你可以为你的问题找到一个更具描述性的标题。完成,我想这会对其他人有所帮助,也许我没有喝足够的咖啡,但又有什么问题呢?@tbone:问题是我如何用较少的语句检查所有3个条件。@tbone:我尝试的是将列表转换为
v|u pk_键到NVL(empno,'$)| NVL(ename,'$)| NVL(job,'$)
从emp\u测试中选择v\u pk\u列表,其中empno=p\u empno然后在结果中检查$,但我认为这不是一个有效的解决方案,只是你可以为你的问题找到一个更具描述性的标题。完成后,我想这会对其他人有所帮助,因为我没有喝足够的咖啡,但问题又是什么呢?@tbone:问题是我如何用较少的语句检查所有3个条件。@tbone:我尝试的是将列表转换为
v_pk_键到NVL(empno,'$)| NVL(ename,'$)| NVL(job,'$)
以及
从empno=pempno
然后在结果中检查$,但我发现这不是一个有效的解决方案:列不总是3,它可能会变化10+,我们需要使用10多个本地值vairable@GauravSoni如果有变化,,如何知道字符串中的哪个字段映射到另一个表中的哪个字段?:我只想检查列值的可空性和行数,我不想要列的值,这可以通过我前面的解释来实现,但需要一个更优化的解决方案,这就是我为什么要这样做的原因here@GauravSoni在你的帖子里,你说“1.使用此列列表检查emp_测试表(v_pk_键)”。如果“v_pk_键”“是一个csv列表,表示emp_测试的3列,我是说拆分列表,以便您可以执行此操作:从emp_测试中选择*,其中empno=p_empno和ename=l_ename和job=l_job。。。;每次我看到csv列表中的元素试图以有意义的方式使用时,都会导致问题,但我假设您无法更改模式(每个人似乎都这么说),因此我将避免该参数。示例:列不总是3它可能会变化10+,我们需要使用10个以上的本地值vairable@GauravSoni如果有变化,,如何知道字符串中的哪个字段映射到另一个表中的哪个字段?:我只想检查列值的可空性和行数,我不想要列的值,这可以通过我前面的解释来实现,但需要一个更优化的解决方案,这就是我为什么要这样做的原因here@GauravSoni在你的帖子里,你说“1.使用此列列表检查emp_测试表(v_pk_键)”。如果“v_pk_键”“是一个csv列表,表示emp_测试的3列,我是说拆分列表,以便您可以执行此操作:从emp_测试中选择*,其中empno=p_empno和ename=l_ename和job=l_job。。。;每次我看到csv列表中的元素试图以有意义的方式使用时,都会导致问题,但我假设您无法更改模式(每个人似乎都这么说),因此我将避免这种争论。
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;
NVL(empno,'$')||NVL(ename,'$')||NVL(job,'$') and then

select v_pk_list from emp_test where empno=p_empno;