0

このコードは機能しませんが、理由はわかりません:

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 : '存在するのは名前だけです'

単独発送も可能ですし、社名も入っているので依頼もOKです

何が起こっている?

答えてくれてありがとう

注:問題は、このコードが一度動作するのを見たということです....

4

1 に答える 1

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

ドキュメントから

COLUMN_VALUEプロシージャまたはCOLUMN_VALUE_LONGプロシージャをコールして、問合せのFETCH_ROWS関数によって取得された列の値を決定します

3 番目の例にも示されています。

過去に動作していたことを確認できる唯一の方法は、複数の行をフェッチするループにあった場合です。その場合、最初の行には null 値が表示され、前の行の値には休み。

もちろん、これに動的 SQL を使用する必要はありませんが、これは問題を示すための簡略化された例だと思います。

于 2013-07-30T16:25:19.967 に答える