2016-05-29 76 views
1

如果我有一个PL SQL过程是这样的:PL SQL参数列表为空

Create Or Replace Procedure get_age (first_name varchar(40), last_name varchar(50)) 

Begin 

Select age 
From Person 
Where first = first_name AND last = last_name; 

End; 

它不能保证用户将在为first_namelast_name变量的值传递。

如何在上述步骤中对此进行解释,因为如果其中一个变量没有值,我不想在子句中查询first_namelast_name

+0

我认为这不是您拥有的实际代码。参数没有长度,程序中的'select'必须有'into',否则必须用它来打开游标。如果你只是检索一个值,你会想要一个函数而不是一个过程。如果任一参数是可选的,则可以获得多行,那么您想要发生什么? –

回答

2

您所查询的是好的,因为它是现在,你可以在你的WHERE条款接受空值:

Where (first = first_name OR first_name is NULL) AND (last = last_name OR last_name in NULL); 

通过这种方式,用户可以输入姓氏和名字,只有第一个或最后一个名称或两者都不和结果将按预期进行选择。

+0

感谢您的回复。在where子句中,当你说'first_name是NULL'并且'NULL'中的last_name是将参数'first_name'和'last_name'设置为NULL时?那么,如果用户没有传入任何first_name或last_name作为参数,那么这个where子句的输出是什么?既然你在哪里设置参数为NULL,但是如何影响where子句呢? – DF768

+1

嘿所以这只需要从用户输入first_name姓氏。所以基本上当他们输入名字和姓氏时,它只选择匹配的第一个和最后一个输入的行。如果他们省略了一个参数,那么测试会自动通过。因此,如果他们没有输入first_name,那么where子句是(TRUE)AND(last = last_name),这种情况下用户只能按姓氏搜索。他们没有输入参数(TRUE)和(TRUE)所有行都返回。这是一个非常动态的功能 – EoinS

0

创建或替换程序get_age(如first_name VARCHAR(40)默认为空,姓氏VARCHAR(50),默认为空)

开始

选择年龄的人在哪里第一= NVL(FIRST_NAME,第一)和last = nvl(last_name,last);

End;