2013-12-10 13 views
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

回答

0

這是因爲你在你的表定義使用CHAR

例如,您輸入的'BROCK'將被存儲爲'BROCK ' - 填滿所有可用空間的空間。

將表格定義更改爲使用VARCHAR2而不是所有的都可以。

+0

如果因爲某種原因在工作環境中無法或不想更改表def,我需要做什麼,我是否需要將我的變量更改爲char?我如何修改它,使它仍然是一個具有相同表def的動態用戶輸入? – user2184653

+0

只是改變表def,我改變了varchar2爲char,它的工作!謝謝 – user2184653

+0

您可以通過修剪存儲的值來解決這個問題,以免除比較的額外空間:'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文章。 –

相關問題