出血本啦!!!200分求一存储过程!好难呀!

时间:2021-04-20 11:53:49
我的表结构如下

员工号,姓名,出生日期,职务,职称,所属部门,最高学历。

题目要求,用一个存储过程中实现,根据任意条件查询,返回查询结果。

例如,只输入员工号进行查询,或输入所属部门和最高学历进行查询,或按年龄和职称进行查询等。。

也就是说每次输入的查询条件都不定,请问有什么办法吗??

用其它方法实现也行??多谢各位啦!

12 个解决方案

#1


任意條件?總是有范圍的。
你可以提供几個查詢項讓用戶進行查詢。
這個當然在前端做方便拉,至少查詢條件的獲取是在前端做的。

#2


把所有字段有连接函数连在一起成一个大的字符串,然后用类似查询看输入的字符串是否出现在以上的字符串中,返回结果!

#3


这个不难,可以用过程的重载

#4


这种查询我都是在前段的用户界面上实现的,而且一般也就是返回一条SQL语句,所以我以为没有必要写成存储过程。。

#5


CREATE OR REPLACE PACKAGE pkg_test
AS
   TYPE myrctype IS REF CURSOR;
END pkg_test;
/
create procedure pro(p_empno in varchar2,p_name in varchar2,p_bdate in date,p_zm in varchar2,p_zf in varchar2,p_dept in varchar2,p_xj in varchar2,p_rc out pkg_test.myrctype)
as
str varchar2(100);
begin
str;='select * from tab1 where 1=1';
if  p_empno is not null then
str:=str||' and empno='||p_empno;
end if;
if p_name is not null then
str:=str||' and name='||p_name;
end if;
if p_bdate is not null then
str:=str||' and bdate='||p_bdate;
end if;
if p_zm is not null then
str:=str||' and zm='||p_zm;
end if;
if p_zf is not null then
str:=str||' and zf='||p_zf;
end if;
if p_dept is not null then
str:=str||' and dept='||p_dept;
end if;
if p_xj is not null then
str:=str||' and xj='||p_xj;
end if;
open str for p_rc;
end;
/

#6


就算你用什么债实现了这个过程,我觉得也没什么意义!~
首先那些条件是谁提出的?肯定是前端用户。

#7


用一条sql,在应用程序中带入变量:
 
    select * from emp
      where 员工号 = decode(员工号_参数,null,员工号,员工号_参数)
        and 姓名   = ....

或把字段是字符类型的改写为 emp_col like 某参数||'%'

#8


str:='select * from tab1 where empno=nvl('||p_empno||',empno) and name=nvl('||p_name||',name) and bdate=nvl('||p_bdate||',bdate) and zm=nvl('||p_zm||',zm) and zf=nvl('||p_zf||',zf) and dept=nvl('||p_dept||',dept) and xj=nvl('||p_xj||',xj)';
open str for p_rc;

#9


up

#10


这种要求,你做一个视图,将你要查询的字段都包括进去.在前端进行控制就行了.为什么要写存储过程?你又不往表里写数据,写存储过程没有意义!

#11


CREATE OR REPLACE p_query
(
emp_id IN VARCHAR2,
name IN VARCHAR2,
birthday IN VARCHAR2,
……
v_cur OUT pk_type.ref_cursor
/*
存储过程所需要的所有条件由前台传过来,前台在获取用户检索条件的时候由代码判断对应的条件,如果为空,则对应的变量设置为'%',如果不为空则设为'%用户条件%',然后用这些条件调用存储过程,过程返回检索到的数据。
*/
)

AS
……
BEGIN
OPEN v_cur for
      SELECT relation,nvl(sum(num_cdrs),0),nvl(sum(durations),0),nvl(sum(sett_fees/100),0)
        FROM trw_settle_report
       WHERE 员工号 LIKE 'emp_id'
         AND 姓名 LIKE 'name'
         AND 出生日期 LIKE 'birthday'
         AND ……;
EXCEPTION:
WHEN OTHERS THEN
……;

END;

#12


肯定用小虫的方法啦
在前台过滤数据就行了
小虫一百分,我一百分算了!~~~~~~~~~~~~~~~~~~~~~~

顺便问,浪子是*同胞?呵呵,你好

#1


任意條件?總是有范圍的。
你可以提供几個查詢項讓用戶進行查詢。
這個當然在前端做方便拉,至少查詢條件的獲取是在前端做的。

#2


把所有字段有连接函数连在一起成一个大的字符串,然后用类似查询看输入的字符串是否出现在以上的字符串中,返回结果!

#3


这个不难,可以用过程的重载

#4


这种查询我都是在前段的用户界面上实现的,而且一般也就是返回一条SQL语句,所以我以为没有必要写成存储过程。。

#5


CREATE OR REPLACE PACKAGE pkg_test
AS
   TYPE myrctype IS REF CURSOR;
END pkg_test;
/
create procedure pro(p_empno in varchar2,p_name in varchar2,p_bdate in date,p_zm in varchar2,p_zf in varchar2,p_dept in varchar2,p_xj in varchar2,p_rc out pkg_test.myrctype)
as
str varchar2(100);
begin
str;='select * from tab1 where 1=1';
if  p_empno is not null then
str:=str||' and empno='||p_empno;
end if;
if p_name is not null then
str:=str||' and name='||p_name;
end if;
if p_bdate is not null then
str:=str||' and bdate='||p_bdate;
end if;
if p_zm is not null then
str:=str||' and zm='||p_zm;
end if;
if p_zf is not null then
str:=str||' and zf='||p_zf;
end if;
if p_dept is not null then
str:=str||' and dept='||p_dept;
end if;
if p_xj is not null then
str:=str||' and xj='||p_xj;
end if;
open str for p_rc;
end;
/

#6


就算你用什么债实现了这个过程,我觉得也没什么意义!~
首先那些条件是谁提出的?肯定是前端用户。

#7


用一条sql,在应用程序中带入变量:
 
    select * from emp
      where 员工号 = decode(员工号_参数,null,员工号,员工号_参数)
        and 姓名   = ....

或把字段是字符类型的改写为 emp_col like 某参数||'%'

#8


str:='select * from tab1 where empno=nvl('||p_empno||',empno) and name=nvl('||p_name||',name) and bdate=nvl('||p_bdate||',bdate) and zm=nvl('||p_zm||',zm) and zf=nvl('||p_zf||',zf) and dept=nvl('||p_dept||',dept) and xj=nvl('||p_xj||',xj)';
open str for p_rc;

#9


up

#10


这种要求,你做一个视图,将你要查询的字段都包括进去.在前端进行控制就行了.为什么要写存储过程?你又不往表里写数据,写存储过程没有意义!

#11


CREATE OR REPLACE p_query
(
emp_id IN VARCHAR2,
name IN VARCHAR2,
birthday IN VARCHAR2,
……
v_cur OUT pk_type.ref_cursor
/*
存储过程所需要的所有条件由前台传过来,前台在获取用户检索条件的时候由代码判断对应的条件,如果为空,则对应的变量设置为'%',如果不为空则设为'%用户条件%',然后用这些条件调用存储过程,过程返回检索到的数据。
*/
)

AS
……
BEGIN
OPEN v_cur for
      SELECT relation,nvl(sum(num_cdrs),0),nvl(sum(durations),0),nvl(sum(sett_fees/100),0)
        FROM trw_settle_report
       WHERE 员工号 LIKE 'emp_id'
         AND 姓名 LIKE 'name'
         AND 出生日期 LIKE 'birthday'
         AND ……;
EXCEPTION:
WHEN OTHERS THEN
……;

END;

#12


肯定用小虫的方法啦
在前台过滤数据就行了
小虫一百分,我一百分算了!~~~~~~~~~~~~~~~~~~~~~~

顺便问,浪子是*同胞?呵呵,你好