2016-01-05 26 views
0

我想使用dbms_sql包從表中選擇,但我不能這樣做..任何人都可以告訴我我做錯了什麼?如何使用DBMS_SQL從表中選擇

create or replace function dbsm_sql_SELECT(age IN NUMBER) return VARCHAR2 is 



q VARCHAR2(500); 
    ret NUMBER; 
    c1 number; 

begin 
    q := 'SELECT users_name FROM USERS_TABLE WHERE USERS_AGE = :1'; 

    c1 := dbms_sql.open_cursor; 

    dbms_sql.parse(c1,q,dbms_sql.native); 
    dbms_sql.bind_variable(c => c1, name => ':1' , value => age); 

    ret := dbms_sql.execute(c1); 
    dbms_sql.close_cursor(c1); 

    dbms_output.put_line(ret); 
    return('a'); 
end dbsm_sql_SELECT; 
+0

檢查[文件](http://docs.oracle.com/database/121/ ARPLS/d_sql.htm#ARPLS058) - 您錯過了一些像FETCH_ROWS,COLUMN_VALUE這樣的調用。 –

+0

我需要一些基本的例子來獲得概念不先進.. docs.oracle使初學者幾乎沒有意義..謝謝! – Licentia

回答

0

這裏..試試這個..我已經切換到從公共表查詢

clear screen 
SET serveroutput ON size 1000000 

declare 
function dbsm_sql_SELECT(age IN NUMBER) return VARCHAR2 is 



q VARCHAR2(500); 
    ret NUMBER; 
    c1 number; 

    l_username VARCHAR2(40); 

begin 
    q := 'SELECT username FROM user_USERS WHERE user_id < :1'; 

    c1 := dbms_sql.open_cursor; 

    dbms_sql.parse(c1,q,dbms_sql.native); 

    DBMS_SQL.DEFINE_COLUMN(c1, 1, l_username,40); 
    --define any other columns you want 

    dbms_sql.bind_variable(c => c1, name => ':1' , value => age); 


    ret := dbms_sql.execute(c1); 

    LOOP 
     IF DBMS_SQL.FETCH_ROWS(c1)>0 THEN 
     DBMS_SQL.COLUMN_VALUE(c1, 1, l_username); 
     --get values of any columns you previously defined 

     ELSE 

    -- No more rows to copy: 
     EXIT; 
     END IF; 
    end loop; 

    dbms_sql.close_cursor(c1); 

    dbms_output.put_line(ret); 
    --return teh correct value 
    return(l_username); 
end ; 

begin 

dbms_output.put_line(dbsm_sql_SELECT(1000)); 
end; 
/