“是故学然后知不足,教然后知困。”——《礼记》
昨天教练问了我两个Oracle的问题,一个是关于null的问题,一个是关于SP的调用。都是大家经常遇到的问题,故整理一下周边知识以飨众人。
01
—
NULL vs. 空字符串
Oracle 把‘’和null看作是一回事。测试一下,
create table testNUll ( id number)
insert into testNUll values (null);
insert into testNull values ('');
insert into testNull values (1);
猜猜下面的语句会返回什么呢?
select * from testNUll where id=''
oracle会把这句查询理解成,
select * from testNUll where id=null
所以查询结果为空,
那下面的查询行不行呢?
select * from testNUll where id is ''
很遗憾,不行。
02
—
SP的调用
设若有这样一个SP
create or replace procedure testSP(p1 in varchar2(20),
p2 in number default 10,
p3 out varchar2(40)) as
begin
dbms_output.put_line(p1);
dbms_output.put_line(p2);
p3 := 'x';
end;
首先是怎么不传参而使用default值。可以这样做,
DECLARE
q3 varchar2(3);
BEGIN
testSP(p1=>'x', p3=>q3);
dbms_output.put_line('done');
END;
然后是如何才能动态地调用这个SP,做法如下,
DECLARE
plsql_block varchar2(100);
q1 varchar2(20);
q3 varchar2(30);
BEGIN
plsql_block := 'BEGIN testSP(:p1,:p2,:p3); END;';
q1:='x';
EXECUTE IMMEDIATE plsql_block USING 'x', '' , out q3;
dbms_output.put_line(q3);
END;
这里有两个地方需要注意,首先是q3前必须要有out,不然会得到一个错误
其次,第二个参数我使用了‘’(空字符串),如果用null也是一个错误,
为什么会这样?这是Oracle的霸王条款,就是不支持。官方文档提到,在EXECUTE IMMEDIATE语句中,Oracle10.2不支持传TRUE/FALSE,到11g,不支持TRUE/FLASE和NULL,到12c不支持NULL。
领取专属 10元无门槛券
私享最新 技术干货