我可以编写这类程序吗?

时间:2018-08-13 18:21:10

标签: oracle plsql

Create or replace procedure p1(
      name in varchar2
)
Is
  Details1 emp%rowtype;
  Details2 dept%rowtype;
Begin
  If name in (select ename from emp)
  Then
    Select * into details1 from emp 
    where ename=name;
    dbms_output.put_line(details1.deptno||' 
    '||details1.ename);
  End if;
  If name in (select dname from dept)
  Then
    Select * into details2 from dept 
    where dname=name;
    dbms_output.put_line(details2.deptno||' 
    '||details2.dname);
  End if;
End;

如果我这样称呼它:

Exec p1('BLAKE')

我想要输出:

Deptno          Ename
-----------    ------------
20              BLAKE

如果我这样称呼它:

Exec p1('Sales')

我想要输出:

Deptno          Dname
-----------    ------------
30              SALES

在我的程序中,我接受参数变量,如果该变量存在于我的表列中,则通过在该变量上传递任何名称,然后我要从该表中获取数据。

我举一个例子: 当我们在Google中编写ronaldo时,足球桌上会提供有关ronaldo的信息(假设足球是桌子,而足球桌上则存在ronaldo)。 当我们在Google中编写奥巴马时,有一个信息提供了来自美国总统表的奥巴马的信息....如果我们写任何名称并且该名称存在于任何表列中,那么我希望从该表中获取数据。

2 个答案:

答案 0 :(得分:1)

就像别人所说的那样,很难理解您想要的内容,但是我相信您想要的是以下内容,完全未经测试的代码,因此可能会有一些语法错误,但至少给您提供了另一种思路。

Create or replace procedure p1(name in varchar2) Is

  V_name varchar2(1000) default null;
  v_dept varchar2(100) default null;
Begin

  begin
    select ename, deptno
    into v_name, v_dept
    from emp
    where upper(trim(name)) = upper(trim(v_name));
  exception 
    when no_data_found then
       v_name = null;
       v_dept = null; 
    when to_many_rows then
       -- handle this however you need
  end;    

  If v_name is not null then
    dbms_output.put_line(v_deptno||' '||v_name);
  else
    begin
      select dname, deptno
      into v_name, v_dept
      from dept 
      where upper(trim(name)) = upper(trim(v_name));
    exception 
      when no_data_found then
         v_name = null;
         v_dept = null; 
    when to_many_rows then
       -- handle this however you need
    end;     
    If v_name is not null then
      dbms_output.put_line(v_dept||' '||v_name);
    End if;
  end if;
End;

答案 1 :(得分:1)

与您所描述的最接近的是:

一条SQL语句,带有一个绑定变量:name。从EMP和DEPT中选择;输出一列,其中包含部门编号,名称(甚至不需要使用,因为在所有情况下都将其用作输入值),以及附加的列“ type”以显示名称是在EMP中还是在EMP中找到部门如果您随后必须由此创建一个过程,那么这部分就不重要了。

select  deptno, ename as name, 'EMPL' as classif
  from  emp
  where ename = :name
union all
select  deptno, dname, 'DEPT'
  from  dept
  where dname = :name
;