表为:CREATE TABLE TEST (ID0000 CHAR(10),ZWBH00 VARCHAR2(12),NAME00 VARCHAR2(20));
PL/SQL中测试执行:CREATE OR REPLACE PROCEDURE SP_TEST
         (
                   PI_ID0000  IN CHAR ,    -- 个人编号
                   PI_ZWBH00  IN CHAR      -- 职务编号
         )         IS
             RT_RYXX      TEST%ROWTYPE ;         --   人员信息
         BEGIN
            SELECT *
            INTO RT_RYXX 
            FROM TEST
            WHERE TRIM(ID0000) = TRIM(PI_ID0000)     -- 个人编号
            AND   TRIM(ZWBH00) = TRIM(PI_ZWBH00);    -- 职务编号
     
            DBMS_OUTPUT.PUT_LINE(RT_RYXX.ZWBH00);
      EXCEPTION
           WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('EXCEPTION ERROR');
      END ;
输入测试数据:      PI_ZWBH00 := '200507000482';
      PI_ID0000 := '0000020783';
结果跳到: DBMS_OUTPUT.PUT_LINE('EXCEPTION ERROR');同样:

                   PI_ID0000  IN CHAR ,    -- 个人编号
                   PI_ZWBH00  IN CHAR      -- 职务编号
改为:
                   PI_ID0000  IN TEST.ID0000%TYPE,    -- 个人编号
                   PI_ZWBH00  IN TEST.ZWBH00%TYPE     -- 职务编号依然跳到:DBMS_OUTPUT.PUT_LINE('EXCEPTION ERROR');但是如果单独在:DECLARE 
        RT_RYXX    TEST%ROWTYPE;         
        PI_ID0000  TEST.ID0000%TYPE ;   -- 改成为CHAR 不能读出数据,为什么?
        PI_ZWBH00  TEST.ZWBH00%TYPE ;   -- 同上
BEGIN   
      -- 赋初值
      PI_ZWBH00 := '200507000482' ;
      PI_ID0000 := '0000020783';
        
      SELECT *
    INTO   rt_ryxx
    FROM   TEST                                         -- 人员信息表
    WHERE  trim(ID0000) = trim(PI_ID0000)               -- 个人编号
             AND  trim(ZWBH00) = trim(PI_ZWBH00);              -- 职务编号
        
      DBMS_OUTPUT.put_line(rt_ryxx.ZWBH00) ;
EXCEPTION
         WHEN OTHERS THEN
              DBMS_OUTPUT.PUT_LINE('EXCEPTION ERROR');
END;却可以读出结果:'200507000482' 为什么?主要是在过程中为什么读不出数据?大虾们帮帮忙啊,急.

解决方案 »

  1.   

    将PI_ZWBH00改为varchar再试试看是否可以
      

  2.   

    定义一个字符串变量,把出错信息显示出来分析一下。如:
    errmsg:=sqlerrm(sqlcode);
    dbms_output.put_line(errmsg);
      

  3.   

    问题出在这儿:
    WHERE TRIM(ID0000) = TRIM(PI_ID0000)     -- 个人编号
    AND   TRIM(ZWBH00) = TRIM(PI_ZWBH00);    -- 职务编号
    不允许对输入参数进行运算!即不允许改变输入参数的值!
    trim(...)函数去除了输入参数中的空格,改变了输入参数。