如何通过SQL存储过程实现参数可变的查询

比如:学生表有姓名和学号等一系列表示学生的字段,想通过一个存储过程实现:
1. 只提供姓名参数;
2. 只提供学号参数;
3. 都提供(两个条件是&关系);
4. 都不提供(搜全部)

下面是一个 Oracle 的存储过程的例子。
通过参数的默认值来设置。

SQL> CREATE OR REPLACE PROCEDURE HelloWorld3 (
2 p_user_name VARCHAR2,
3 p_val1 VARCHAR2 DEFAULT ' Good Moning,',
4 p_val2 VARCHAR2 DEFAULT ' Nice to Meet you'
5 ) AS
6 BEGIN
7 dbms_output.put_line('Hello ' || p_user_name || p_val1 || p_val2 || '!'
);
8 END HelloWorld3;
9 /

Procedure created.

下面是 只穿部分参数的情况。

SQL> BEGIN
2 HelloWorld3('Edward');
3 HelloWorld3('Edward', ' Good Night,');
4 HelloWorld3('Edward', ' Good Night,', 'Bye');
5 END;
6 /
Hello Edward Good Moning, Nice to Meet you!
Hello Edward Good Night, Nice to Meet you!
Hello Edward Good Night,Bye!

PL/SQL procedure successfully completed.

下面用于说明当最后2个参数是有默认的时候,如何跳过中间那个。

SQL> BEGIN
2 HelloWorld3('Edward');
3 HelloWorld3('Edward', p_val1 => ' Good Night,');
4 HelloWorld3('Edward', p_val1 => ' Good Night,', p_val2 => 'Bye');
5 HelloWorld3('Edward', p_val2 => ' HeiHei ');
6 END;
7 /
Hello Edward Good Moning, Nice to Meet you!
Hello Edward Good Night, Nice to Meet you!
Hello Edward Good Night,Bye!
Hello Edward Good Moning, HeiHei !

PL/SQL procedure successfully completed.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-12
可以的,在存储过程中使用姓名和学号两个参数,当某个参数为空时,则不作为条件。两个都为空,则都不作为条件
这样:
CREATE PROCEDURE MYPROC
@XM VARCHAR(40)='',
@XH VARCHAR(10)=''
as
select * from tablename WHERE (@XM='' or 姓名=@xm ) and (@xh='' or 学号=@xh)
go追问

忘了说,是oracle版本

本回答被网友采纳