2013-07-30 29 views
0

這段代碼的不工作,但我不知道爲什麼:使用DBMS_SQL

set serveroutput on buffer 2560000 
declare 
requete varchar2(4000); 
name_firm varchar2(35); 
curseur_ref number; 
response number; 

begin 
    curseur_ref := dbms_sql.open_cursor; 
    requete := 'SELECT trim(myTable.myColumn) from myTable'; 

    dbms_sql.parse(curseur_ref, requete, dbms_sql.native); 
    dbms_sql.define_column(curseur_ref, 1, name_firm, 35); 
    response := dbms_sql.execute(curseur_ref); 
    dbms_sql.column_value(curseur_ref, 1, name_firm); 
    dbms_output.put_line('NB enregs : ' || dbms_sql.fetch_rows(curseur_ref)); 
    dbms_output.put_line('name_firm : ' || name_firm); 
    dbms_sql.close_cursor(curseur_ref); 
end; 

沒有PLSQL錯誤

結果是:

NB enregs:1(它發現一個...這是正確的)

name_firm:「有什麼,但一個名字存在」

釷e請求是好的,因爲我可以單獨發送它,並有公司的名稱

發生了什麼事情?

謝謝你回答

注:事情是,我看到這個代碼工作,一旦....

回答

0

你在錯誤的地方你column_value通話;它需要後取:

... 
    response := dbms_sql.execute(curseur_ref); 
-- dbms_sql.column_value(curseur_ref, 1, name_firm); 
    dbms_output.put_line('NB enregs : ' || dbms_sql.fetch_rows(curseur_ref)); 
    dbms_sql.column_value(curseur_ref, 1, name_firm); 
    dbms_output.put_line('name_firm : ' || name_firm); 
... 

其中給出:

NB enregs : 1 
name_firm : some val 

From the documentation

呼叫COLUMN_VALUE過程或COLUMN_VALUE_LONG過程來確定列由FETCH_ROWS檢索的值功能 供您查詢

它也顯示在their third example

我能看到你看到它在過去工作的唯一方法是如果它曾經在一個循環中獲取多行,在這種情況下,你會看到第一個和以前的空值其餘行的值。

當然,沒有必要爲此使用動態SQL,但我認爲這是一個精簡的示例來演示此問題。