使用dbms_sql

时间:2013-07-30 15:48:32

标签: oracle plsql

这段代码不起作用,但我不知道原因:

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:'除了名称之外什么都没有'

请求很好,因为我可以单独发送并拥有公司名称

发生了什么事?

感谢您的回答

注意:事情就是我看到这段代码工作了一次......

1 个答案:

答案 0 :(得分: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,但我认为这是一个用于演示此问题的精简示例。