Oracle常见问题解答(1)

是故学然后知不足,教然后知困。——《礼记》

昨天教练问了我两个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。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180529G1EUYB00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券