oracle to_char、to_number的使用问题
本帖最后由 monday707455915 于 2013-09-02 14:27:25 编辑 我在写存储过程的时候写了以下代码:
CREATE OR REPLACE PROCEDURE proc_del_shipplan (
wl_bay_no IN VARCHAR2,
wl_deck_id IN VARCHAR2,
wl_ship_no IN VARCHAR2,
wl_Return OUT VARCHAR2)
/*====================================================
名称:proc_del_shipplan
参数:wl_bay_no varchar2 输入变量,传入贝位号,一定为偶数,表示一个大贝;
wl_deck_id varchar2 输入变量,传入甲板上下的标识;
wl_ship_no varchar2 输入变量,传入船号;
wl_return number 输出变量,传出过程执行状态,99--执行成功,--执行失败。
功能:利用三个传入参数检索ship_plan中的work_queue_no字段;
然后统计work_queue表中work_queue_no in 上面查询结果的记录的条数,
若记录为0,则删掉ship_plan中相应的记录,否则不做处理。
版本:v1.0 wangxf 20130902
=====================================================*/
IS
wl_row_cnt NUMBER;
wl_que_typ VARCHAR2 (4);
wl_debug NUMBER := 0;
wl_bay_temp NUMBER;
wl_b1 ship_plan.bay_no%TYPE;
wl_b2 ship_plan.bay_no%TYPE;
wl_b3 ship_plan.bay_no%TYPE;
wl_b4 ship_plan.bay_no%TYPE;
BEGIN
wl_bay_temp := TO_NUMBER (wl_bay_no); --转换为数字型,方便计算
wl_b1 := TO_CHAR (wl_bay_temp - 1, '099');
wl_b2 := TO_CHAR (wl_bay_temp, '099');
/* wl_b3 := TO_CHAR (wl_bay_temp - 1, '099')
|| '/'
|| TO_CHAR (wl_bay_temp + 1, '099');*/
wl_b4 := TO_CHAR (wl_bay_temp + 1, '099');
BEGIN
SELECT COUNT (0)
INTO wl_row_cnt
FROM work_queue a, ship_plan b
WHERE a.tool_no = b.ship_no
AND a.work_queue_no = b.work_queue_no
AND a.queue_typ = b.queue_typ
AND b.deck_id = wl_deck_id
AND b.ship_no = wl_ship_no
AND b.bay_no = wl_bay_no; --问题所在行
/*b.bay_no = wl_b1
or b.bay_no = wl_b2
or b.bay_no = wl_b3
or b.bay_no = wl_b4;
*/
EXCEPTION
WHEN OTHERS
THEN
wl_Return := SQLCODE || SQLERRM;
RETURN;
END;
/*
IF wl_row_cnt = 0
THEN
BEGIN
DELETE FROM ship_plan
WHERE ship_no = wl_ship_no
AND bay_no = wl_bay_no
AND deck_id = wl_deck_id;
EXCEPTION
WHEN OTHERS
THEN
wl_Return := SQLCODE || SQLERRM;
RETURN;
END;
END IF;
commit;*/
wl_return := 99;
END;
/
问题描述:测试发现,直接使用过程传入参数wl_bay_no,是可以检索出数据的,但是经过我的to_number、to_char两次转换,就检索不出数据了。求这两个转换函数的详细描述,有什么内幕在吗 oracle to_char to_number
[解决办法]
如果你确认输入参数固定是3位长的话应该木有问题,but
select to_char(to_number('5'), '099') b from dual;
select to_char(to_number('05'), '099') b from dual;
select to_char(to_number('005'), '099') b from dual;
看看上面这三句的区别就明白了!