2011-04-19 41 views
2

我试图根据网络ID获取用户的ID号,但由于某种原因,当我尝试传入在这个PL/SQL中的SELECT语句的WHERE子句中的网络ID我得到一个错误。为什么在将字符串变量传递到PL/SQL时出现'No data found',其中子句

但是,如果我输出user_rec.USER_NAME到控制台有什么有效的值,如果我硬编码一个字符串ex:WHERE UserID = 'USERNAME'它也可以按预期工作。它似乎只对WHERE条款中的字符串变量失败.....?

ORA-01403: no data found 
ORA-06512 at line 12 
01403.00000 - "no data found" 
*Cause 
*Action 
Error at line 1 

PL/SQL:

DECLARE 
    v_addressbooknum number; 
    v_addresstype nchar(3); 
CURSOR SELECT_PORTALUSERS is 
SELECT USER_NAME FROM PERSONS WHERE DEFAULT_GROUP <> 'Employees'; 
BEGIN 
    FOR user_rec IN SELECT_PORTALUSERS LOOP 
    -- Fetch Address Book # based on user ID 
    SELECT ABNum INTO v_addressbooknum 
    FROM [email protected] 
    WHERE UserID = user_rec.USER_NAME; 
    END LOOP; 
END; 

============================== ======================================= 编辑

这里是我根据DCookie的建议运行的新PL/SQL

DECLARE 
    v_addressbooknum number; 
    v_addresstype nchar(3); 
CURSOR SELECT_PORTALUSERS is 
SELECT USER_NAME FROM PERSONS WHERE DEFAULT_GROUP <> 'Employees'; 
BEGIN 
    FOR user_rec IN SELECT_PORTALUSERS LOOP 

    -- DEBUG -- 
    DBMS_OUTPUT.PUT_LINE('DEBUG Found User: ' || user_rec.USER_NAME); 
    -- END DEBUG -- 
    BEGIN 
     -- Fetch Address Book # based on user ID 
     SELECT ABNum INTO v_addressbooknum 
     FROM [email protected] 
     WHERE UserID = user_rec.USER_NAME; 
    EXCEPTION 
     WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('User: '||user_rec.USER_NAME); 
    END; 
    END LOOP; 
    -- DEBUG -- 
    DBMS_OUTPUT.PUT_LINE('DONE'); 
    -- END DEBUG -- 
END; 

这里是我得到的输出,你可以看到如果发现user_rec.user_name中的值。如果我将其中一个找到的用户ID硬编码到where子句中,它可以正常工作(这意味着用户ID存在于正在执行提取的表中)。

DEBUG Found User: USER846 
User: USER846 
DEBUG Found User: USER241 
User: USER241 
DEBUG Found User: USER780 
User: USER780 
DEBUG Found User: USER783 
User: USER783 
DEBUG Found User: USER294 
User: USER294 
DONE 

回答

3

如果你的循环不断选择USER_NAME不是在远程表(例如:远程列已经尾随空白),你会得到这个错误,因为你不处理SELECT语句中的任何异常。我想通过添加异常处理和写入调试信息调试此:

BEGIN 
    FOR user_rec IN SELECT_PORTALUSERS LOOP 
    -- Fetch Address Book # based on user ID 
    BEGIN 
    SELECT ABNum INTO v_addressbooknum 
    FROM [email protected] 
    WHERE UserID = user_rec.USER_NAME; -- TRIM column or variable if necessary 
    EXCEPTION 
     WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('User: '||user_rec.user_name); 
    END; 
    END LOOP; 
END; 
+0

所以我在循环的开始(前BEGIN)增加了'DBMS_OUTPUT',并添加'EXCEPTION '按照你的建议。但现在我得到:“DEBUG USERNAME:USER1 \ n用户:USER1 \ n DEBUG USERNAME:USER2 \ n用户:User2”因此它找到一个值,但仍然认为那里没有一个值。 – ProfessionalAmateur 2011-04-19 21:03:35

+3

您的异常处理程序正在触发的事实表明该值不存在。你确定用户名中没有任何额外的空格吗?尝试:SELECT DUMP(USER_NAME,17)FROM PERSONS WHERE DEFAULT_GROUP <>'Employees';在命令提示符处并确保返回的值看起来合理。 – DCookie 2011-04-20 01:55:50

+0

我将在上面的编辑中发布Im正在运行的和DBMS输出,以便我可以使用更多字符并正确格式化。 FOR循环对每个用户ID都是循环的。 – ProfessionalAmateur 2011-04-20 03:22:01

2

这似乎只是并非是个人的所有用户也在v_addressbooknum。

试试下面的SQL来查找存在于个人的所有用户,但不是在v_addressbooknum

SELECT USER_NAME FROM PERSONS 
MINUS 
SELECT userID FROM v_addressbooknum 
; 

然后使用

Exception 
    When NO_DATA_FOUND Then 
    DBMS_OUTPUT.PUT_LINE('no data found'); 
End; 

来处理此错误情况。

不要使用“其他人”处理“找不到数据”。

0

看起来就像是一个dataformatting问题,我TRIM都编列和WHERE子句中的变量,现在看来似乎正确地返回数据......奇怪,因为它们都是VARCHAR小号

DECLARE 
    v_addressbooknum number; 
    v_addresstype nchar(3); 
CURSOR SELECT_PORTALUSERS is 
SELECT USER_NAME FROM PERSONS WHERE DEFAULT_GROUP <> 'Employees'; 
BEGIN 
    FOR user_rec IN SELECT_PORTALUSERS LOOP 

    BEGIN 
     -- Fetch Address Book # based on user ID 
     SELECT ABNum INTO v_addressbooknum 
     FROM [email protected] 
     WHERE TRRIM(UserID) = TRIM(user_rec.USER_NAME); 
    EXCEPTION 
     WHEN OTHERS THEN 
     DBMS_OUTPUT.PUT_LINE('User: '||user_rec.USER_NAME); 
    END; 
    END LOOP; 

END; 
+1

如果将TRIM应用于您的数据可以解决您的问题,那么这正是我想告诉你的错误。在其中一个模式中,user_name字段中包含空格。这实际上不是数据格式问题,而是数据问题。 – DCookie 2011-04-20 16:49:50

+0

@DCookie - 是的,我误解了你在说什么,我把它看作是空值/空值,而不是数据不匹配。 – ProfessionalAmateur 2011-04-20 19:28:03

0

你能否把表格定义和几行?

我认为

SELECT ABNum INTO v_addressbooknum 
     FROM [email protected] 
     WHERE UserID = user_rec.USER_NAME; 

从表@ DBLINK列用户ID是不一样的列user_rec。用户名;

在你已经发布的代码

,选择去与每行与NO_DATA_FOUND异常

+0

我不能,为了安全起见,我清理了实际的表格,链接和列信息。它确实是一个数据匹配,其中一个表有尾随空白,另一个没有。 – ProfessionalAmateur 2011-04-20 19:29:33

相关问题