null的问题

jiezhi 2002-09-12 03:30:21
我有这样一段代码:
IF v_conditions IS NOT NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list||' WHERE '||v_conditions||'';
END IF;
IF v_conditions IS NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list||'';
END IF;
单步跟踪的时候发现,当v_conditions不为NULL的时候,两个if语句里的语句都执行,但第二个语句没有把v_sql的值改变。
怎么回事?
...全文
43 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyfoot 2002-09-12
  • 打赏
  • 举报
回复
UP
jiezhi 2002-09-12
  • 打赏
  • 举报
回复
散分,散分!
jiezhi 2002-09-12
  • 打赏
  • 举报
回复
谢谢大家捧场,呵呵
这个PL/SQL DEVELOPER害我不浅
IronPromises 2002-09-12
  • 打赏
  • 举报
回复
晕倒,吐血。
Amin_woo 2002-09-12
  • 打赏
  • 举报
回复
^_^
developer2002 2002-09-12
  • 打赏
  • 举报
回复
倒!
kuailexq2000 2002-09-12
  • 打赏
  • 举报
回复
not understand
other error
up?
zhaoyongzhu 2002-09-12
  • 打赏
  • 举报
回复
^_^
jlandzpa 2002-09-12
  • 打赏
  • 举报
回复
呵呵
jiezhi 2002-09-12
  • 打赏
  • 举报
回复
我是在PL/SQL DEVELOPER里单步跟踪看的
当我看到好像两个if都执行时,事实是只执行了一个,因为我加了
断点后,程序并没有停下来
唉,白忙了半天
bzszp 2002-09-12
  • 打赏
  • 举报
回复
你的测试不正确:
SQL> create or replace procedure sp_liao IS
2 v_tmp STRING(100);
3 v_sql STRING(100);
4 v_conditions INTEGER;
5 BEGIN
6 v_sql:='ddd';
7 v_conditions:=1;
8 IF v_conditions=1 THEN
9 IF TRIM(v_sql) IS NOT NULL THEN
10 v_tmp:='lll';
11 dbms_output.put_line('is not null:'||v_tmp);
12 END IF;
13 IF TRIM(v_sql) IS NULL THEN
14 v_tmp:='kkk';
15 dbms_output.put_line('is null:'||v_tmp);
16 END IF;
17 ELSIF v_conditions=2 THEN
18 NULL;
19 END IF;
20 end sp_liao;
21 /

过程已创建。

SQL> exec sp_liao;
is not null:lll

PL/SQL 过程已成功完成。

只执行了一个判断.
bzszp 2002-09-12
  • 打赏
  • 举报
回复
SQL> declare
2 a varchar2(10):=' ';
3 begin
4 if trim(a) is not null then
5 dbms_output.put_line('not null');
6 end if;
7 if trim(a) is null then
8 dbms_output.put_line('is null');
9 end if;
10 end;
11 /
is null

PL/SQL 过程已成功完成。

SQL> declare
2 a varchar2(10):=' aa ';
3 begin
4 if trim(a) is not null then
5 dbms_output.put_line('not null');
6 end if;
7 if trim(a) is null then
8 dbms_output.put_line('is null');
9 end if;
10 end;
11 /
not null

PL/SQL 过程已成功完成。

SQL>
肯定不是判断is null的问题,你多加几个put_line,可能是别的地方的问题.
jiezhi 2002-09-12
  • 打赏
  • 举报
回复
大家不要看上面的代码了:
我测试了一个过程:
程序1:
create or replace procedure sp_liao IS
v_tmp STRING(100);
v_sql STRING(100);
v_conditions INTEGER;
BEGIN
v_sql:='ddd';
v_conditions:=1;
IF v_conditions=1 THEN
IF TRIM(v_sql) IS NOT NULL THEN
v_tmp:='lll';
END IF;
IF TRIM(v_sql) IS NULL THEN
v_tmp:='kkk';
END IF;
ELSIF v_conditions=2 THEN
NULL;
END IF;
end sp_liao;
------------
v_tmp:='lll'; 和v_tmp:='kkk';都会执行但最后v_tmp='lll'

程序2:
create or replace procedure sp_liao IS
v_tmp STRING(100);
v_sql STRING(100);
v_conditions INTEGER;
BEGIN
v_sql:='ddd';
v_conditions:=1;
IF v_conditions=1 THEN
IF TRIM(v_sql) IS NULL THEN
v_tmp:='lll';
END IF;
IF TRIM(v_sql) IS NOT NULL THEN
v_tmp:='kkk';
END IF;
ELSIF v_conditions=2 THEN
NULL;
END IF;
end sp_liao;
只执行 v_tmp:='kkk';,最后结果v_tmp='kkk'
呵呵,好纳闷
jiezhi 2002-09-12
  • 打赏
  • 举报
回复
上面的太长了,看这个
create or replace procedure SP_BIG_REPORT(
V_BBMC IN STRING,
V_SZDWBH IN STRING
) IS

TYPE c_curtype IS REF CURSOR;
c_cur c_curtype;
str STRING(2000):='';
sql_str STRING(10000):='';
v_table_list STRING(1000):='';--所有关联的表
v_hbh t_bbhb.hbh%TYPE;--行编号
v_lbh t_bblb.lbh%TYPE;--列编号

v_tmp STRING(1000):='';--临时变量

v_conditions STRING(4000):='';--总条件
v_select STRING(1000):='';
v_jsgs t_bbhb.tjhjsgs%TYPE;--计算公式
v_jsjb t_bbhb.hjsjbpx%TYPE;--计算级别
v_hzlx t_bblb.hzlx%TYPE;--汇总类型
v_sql STRING(9000):='';

v_now STRING(14);



BEGIN

--Get "select ..."
v_conditions:='fffffff';
v_jsjb:=1;
IF v_jsjb=1 THEN
v_select:='count(*)';
IF v_hzlx IS NULL THEN
v_hzlx:=' COUNT(*) ';
END IF;
IF TRIM(v_conditions) IS NOT NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list||' WHERE '||v_conditions;
END IF;
IF TRIM(v_conditions) IS NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list;
END IF;
ELSIF instrb(v_jsgs,'SUM')>0 THEN
v_select:='SUM('||v_lbh||')';
v_tmp:=ltrim(v_jsgs,'SUM,');
v_tmp:=REPLACE(v_tmp,',',''',''');
v_tmp:=''''||v_tmp||'''';
v_sql:='SELECT '||v_select||' FROM T_BBSJB'||
' WHERE XMBH IN ('||v_tmp||')'||
' AND HZRQ='''||v_now||''' AND SZDWBH='''||v_szdwbh||'''';

END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;

end SP_BIG_REPORT;
jiezhi 2002-09-12
  • 打赏
  • 举报
回复
我把大部分代码都删除了,剩下这些:


create or replace procedure SP_BIG_REPORT(
V_BBMC IN STRING,
V_SZDWBH IN STRING
) IS
/*----------------------------------------------------------------------------------
功能:得到通用统计报表的数据,存入表T_BBSJB
编写:廖志强
日期:2002年9月11日
-----------------------------------------------------------------------------------*/
TYPE c_curtype IS REF CURSOR;
c_cur c_curtype;
str STRING(2000):='';
sql_str STRING(10000):='';
v_table_list STRING(1000):='';--所有关联的表
v_hbh t_bbhb.hbh%TYPE;--行编号
v_lbh t_bblb.lbh%TYPE;--列编号
v_hmc t_bbhb.hmc%TYPE;--行名称
v_tmp STRING(1000):='';--临时变量
v_gltj STRING(2000):='';--相关条件
v_htj STRING(1000):='';--行条件
v_ltj STRING(1000):='';--列条件
v_conditions STRING(4000):='';--总条件
v_select STRING(1000):='';
v_jsgs t_bbhb.tjhjsgs%TYPE;--计算公式
v_jsjb t_bbhb.hjsjbpx%TYPE;--计算级别
v_hzlx t_bblb.hzlx%TYPE;--汇总类型
v_sql STRING(9000):='';
sub_str STRING(100);
i INTEGER:=1;
k INTEGER;
v_now STRING(14);
CURSOR c_record IS SELECT TRIM(hbh) FROM t_bbhb WHERE bbmc=''||v_bbmc||'' ORDER BY hjsjbpx;
CURSOR c_column IS SELECT TRIM(lbh) FROM t_bblb WHERE bbmc=''||v_bbmc||'' ORDER BY ljsjbpx;


BEGIN

--Get "select ..."
v_conditions:='fffffff';
v_jsjb:=1;
IF v_jsjb=1 THEN
v_select:='count(*)';
IF v_hzlx IS NULL THEN
v_hzlx:=' COUNT(*) ';
END IF;
IF TRIM(v_conditions) IS NOT NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list||' WHERE '||v_conditions;
END IF;
IF TRIM(v_conditions) IS NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list;
END IF;
ELSIF instrb(v_jsgs,'SUM')>0 THEN
v_select:='SUM('||v_lbh||')';
v_tmp:=ltrim(v_jsgs,'SUM,');
v_tmp:=REPLACE(v_tmp,',',''',''');
v_tmp:=''''||v_tmp||'''';
v_sql:='SELECT '||v_select||' FROM T_BBSJB'||
' WHERE XMBH IN ('||v_tmp||')'||
' AND HZRQ='''||v_now||''' AND SZDWBH='''||v_szdwbh||'''';
ELSIF instrb(v_jsgs,'AVG')>0 THEN
v_tmp:=ltrim(v_jsgs,'AVG,');
str:=REPLACE(v_tmp,',','+');
i:=lengthb(v_tmp)-length(REPLACE(v_tmp,'+',''))+1;
v_select:='SUM('||v_lbh||')/'||i||'';
v_tmp:=REPLACE(v_tmp,',',''',''');
v_tmp:=''''||v_tmp||'''';
v_sql:='SELECT '||v_select||' FROM T_BBSJB '||
'WHERE XMBH IN ('||v_tmp||')'||
' AND HZRQ='''||v_now||''' AND SZDWBH='''||v_szdwbh||'''';
ELSIF instrb(v_jsgs,'分子')>0 THEN
v_select:='SUM('||v_lbh||')';
v_tmp:=substrb(v_jsgs,(instrb(v_jsgs,'子,')+3),(instrb(v_jsgs,',分母')-6));
v_tmp:=REPLACE(v_tmp,',',''',''');
v_tmp:=''''||v_tmp||'''';
v_sql:='(SELECT '||v_select||' FROM T_BBSJB'||
' WHERE XMBH IN ('||v_tmp||')'||
' AND HZRQ='''||v_now||''' AND SZDWBH='''||v_szdwbh||''')';
v_tmp:=substrb(v_jsgs,(instrb(v_jsgs,',分母')+6),(length(v_jsgs)+6));
v_tmp:=REPLACE(v_tmp,',',''',''');
v_tmp:=''''||v_tmp||'''';
v_sql:='SELECT TRUNC(('||v_sql||'/(SELECT '||v_select||' FROM T_BBSJB WHERE XMBH IN ('||v_tmp||')'||
' AND HZRQ='''||v_now||''' AND SZDWBH='''||v_szdwbh||''')'||
'),4)*100 FROM DUAL';
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;

end SP_BIG_REPORT;
bzszp 2002-09-12
  • 打赏
  • 举报
回复
你在程序里面多加几个put_line语句仔细检查一下吧,
CHENGXB 2002-09-12
  • 打赏
  • 举报
回复
关注!
jiezhi 2002-09-12
  • 打赏
  • 举报
回复
是呀,我也觉得不可能,但它偏偏发生了!
我单独进行测试的时候,也是正常的,但在我的程序里,却是发生了那样的
非常奇怪的现象。
jlandzpa 2002-09-12
  • 打赏
  • 举报
回复
不可能,把你测试例子也贴出来把.
bzszp 2002-09-12
  • 打赏
  • 举报
回复
奇怪的问题,在这样试一下,看输出什么

IF v_conditions IS NOT NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list||' WHERE '||v_conditions||'';
DBMS_OUTPUT.PUT_LINE('not null:'||v_sql);
END IF;
IF v_conditions IS NULL THEN
v_sql:='SELECT '||v_hzlx||' FROM '||v_table_list||'';
DBMS_OUTPUT.PUT_LINE('null'||v_sql);
END IF;
加载更多回复(1)

17,378

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧