Sql 在动态用户输入中,光标显示为空
我目前正在尝试自己学习动态用户输入,所以根据我所做的研究,下面是我提出的代码Sql 在动态用户输入中,光标显示为空,sql,plsql,cursor,sqlplus,Sql,Plsql,Cursor,Sqlplus,我目前正在尝试自己学习动态用户输入,所以根据我所做的研究,下面是我提出的代码 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)
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;
/
现在,我知道如果用户输入都是空的,它就可以工作,但是当我从调用此过程的另一个脚本传递值时,我的用户定义错误不断出现,当我知道prospect表中有与用户输入对应的值时,游标是空的。
前
我知道游标必须有固定的长度才能工作,就我所知,它是固定长度的,因为若用户不输入任何内容,它将使用空值
所以我想知道是否有人能帮我确定我做错了什么,因为这是我第一次尝试做动态输入
在prospect表中,还有cname、make、model、cyear、color、trim ocode作为列名
这是因为您在表定义中使用了CHAR 例如,您输入的“BROCK”将存储为“BROCK”-空间将填满所有可用空间
更改表定义,改为使用VARCHAR2,所有操作都将正常工作。如果在工作设置中由于任何原因,我不能或不想更改表定义,我需要做什么,我需要将变量更改为char吗?我如何修改它,使它仍然是一个具有相同表定义的动态用户输入?我没有更改表定义,而是将varchar2更改为char,它成功了!谢谢,您可以通过修剪存储的值来解决这个问题,从而消除用于比较的额外空间:where trimcname=:v_cname。或者填充变量:其中cname=rpad:v_cname,20。请参阅关于VARCHAR2/CHAR的AskTom文章。
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.