员工号,姓名,出生日期,职务,职称,所属部门,最高学历。
题目要求,用一个存储过程中实现,根据任意条件查询,返回查询结果。
例如,只输入员工号进行查询,或输入所属部门和最高学历进行查询,或按年龄和职称进行查询等。。
也就是说每次输入的查询条件都不定,请问有什么办法吗??
用其它方法实现也行??多谢各位啦!
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;
/
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 某参数||'%'
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;
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;
(
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;
/
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 某参数||'%'
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;
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;
(
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
肯定用小虫的方法啦
在前台过滤数据就行了
小虫一百分,我一百分算了!~~~~~~~~~~~~~~~~~~~~~~
顺便问,浪子是*同胞?呵呵,你好
在前台过滤数据就行了
小虫一百分,我一百分算了!~~~~~~~~~~~~~~~~~~~~~~
顺便问,浪子是*同胞?呵呵,你好