0
目前,我試圖瞭解我自己的動態用戶輸入,所以根據我做了什麼研究,繼承人的代碼,我想出了光標出現空在一個動態的用戶輸入
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;
/
現在,我知道它的工作原理,如果用戶輸入都是空的,但是當我從另一個調用該過程的腳本傳遞值時,我的用戶定義的錯誤不斷出現,當我知道前景中存在值時,光標爲空表格對應於用戶輸入。 ex。
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
如果因爲某種原因在工作環境中無法或不想更改表def,我需要做什麼,我是否需要將我的變量更改爲char?我如何修改它,使它仍然是一個具有相同表def的動態用戶輸入? – user2184653
只是改變表def,我改變了varchar2爲char,它的工作!謝謝 – user2184653
您可以通過修剪存儲的值來解決這個問題,以免除比較的額外空間:'trim trim(cname)=:v_cname'。或者填寫變量:'where cname = rpad(:v_cname,20)'。請參閱[this](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476)關於VARCHAR2/CHAR的AskTom文章。 –