光标在动态用户输入中为空

Posted

技术标签:

【中文标题】光标在动态用户输入中为空【英文标题】:Cursor comes up empty in a dynamic user input 【发布时间】:2013-12-10 21:09:06 【问题描述】:

我目前正在尝试自己学习动态用户输入,因此根据我所做的研究,这是我想出的代码

SET SERVEROUTPUT ON ;

SET TERMOUT ON;
SET ECHO OFF;

CREATE OR REPLACE PROCEDURE generateProspect 
    (
    v_cname IN VARCHAR2 DEFAULT NULL
    )
    AS

    l_cursor sys_refcursor;
    l_query VARCHAR2(512) DEFAULT 'SELECT * FROM prospect ';

    CURSOR l_template IS 
        SELECT * 
        FROM prospect;

    l_rec  l_template%ROWTYPE;


BEGIN



    IF(v_cname IS NOT NULL)
        THEN
        l_query := l_query||'where cname = :v_cname ';
        ELSE
        l_query :=l_query||'where (1=1 or :v_cname IS NULL) ';
    END IF;




    DBMS_OUTPUT.PUT_LINE(l_query);

        OPEN l_cursor
        FOR l_query
        USING v_cname;

            LOOP
                FETCH l_cursor
                INTO l_rec;

                IF l_cursor%ROWCOUNT =0 THEN
                RAISE_APPLICATION_ERROR(-20000, 'Cursor is empty ');    
                END IF;

                EXIT WHEN l_cursor%NOTFOUND;



                DBMS_OUTPUT.PUT_LINE(l_rec.cname);
            END LOOP;
        CLOSE l_cursor;

        EXCEPTION
        WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE(' No data found in database');

        WHEN TOO_MANY_ROWS THEN
        DBMS_OUTPUT.PUT_LINE('Query returns too many rows of data');

        WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);

END generateProspect;
/

现在,我知道如果用户输入全部为空,它就可以工作,但是当我从另一个调用此过程的脚本传递值时,我的用户定义错误不断出现,当我知道时光标为空潜在客户表中有与用户输入相对应的值。 前任。

Talk to me>desc prospect
Name Null? Type
CRAME NOT NULL CHAR(20)
MAKE NOT NULL CHAR(lO)
MODEL CHAR(8)
CYEAR CHAR (4)
COLOR CHAR(l2)
TRIM CEAR(l6)
OCODE CHAR(4) 

Talk to me>select * from prospect where cname='BROCK';
    more...

    CNAME                MAKE       MODEL    CYEA COLOR        TRIM             OCOD
    -------------------- ---------- -------- ---- ------------ ---------------- ----
    BROCK                MERCEDES   M10      2011 BLACK        BLACK            S23


    Talk to me>@tiprospect
    Enter a customer name: BROCK

    Enter an option code: S23
    old  15:        v_cname:= UPPER('&p_cname');
    new  15:        v_cname:= UPPER('BROCK');


    An error was encountered - -20000 -ERROR- ORA-20000: Cursor is empty

    PL/SQL procedure successfully completed.

我知道光标必须具有固定长度才能工作,据我所知它是固定长度的,因为如果用户不输入任何内容,它会使用空值。

所以我想知道是否有人可以帮助我确定我在这里做错了什么,因为这是我第一次尝试进行动态输入。

在潜在客户表中,列名也有cname、make、model、cyear、color、trim ocode。

Cursor comes up empty in a dynamic user input

【问题讨论】:

【参考方案1】:

这是因为您在表定义中使用了CHAR

例如,'BROCK' 的条目将存储为 'BROCK ' - 空格会填满所有可用空间。

将表定义改为使用VARCHAR2,一切都会正常工作。

【讨论】:

如果由于某种原因在工作环境中我不能或不想更改表定义,我需要做什么,是否需要将变量更改为 char?我将如何修改它,使其仍然是具有相同表定义的动态用户输入? 我没有更改表定义,而是将 varchar2 更改为 char,它起作用了!谢谢 您可以通过修剪存储的值来解决此问题,以消除用于比较的额外空格:where trim(cname) = :v_cname。或者填充变量:where cname = rpad(:v_cname, 20)。请参阅 this AskTom 关于 VARCHAR2/CHAR 的文章。

以上是关于光标在动态用户输入中为空的主要内容,如果未能解决你的问题,请参考以下文章

1.7动态输入详解

删除 Chrome 自动完成的输入光标颜色?

登录表单中的 IoS 自动填充数据在科尔多瓦应用程序中为空(使用角度)

值为空时Chrome中的HTML输入光标位置问题

mybatis入门-动态sql

Console.log 打印后基于用户输入的更改