dポイントプレゼントキャンペーン実施中!

変数が選択リストにありません


下記のコードを実行すると「変数が選択リストにありません」というエラーが出てしまいます。
SELECT文とFETCHのINTOの変数の個数が一致していない場合にこのエラーは出るということらしいのですが、問題ないように思うのです。
下記コードで何が問題になっているのか教えてください。

よろしくお願いします。



set serveroutput on;

declare
-- 各テーブルの全カラムを取得
cursor curcol (p_tblname user_tables.table_name%type) is
select COLUMN_NAME,DATA_TYPE
from user_tab_columns
where table_name = p_tblname
;

v_sql varchar2(1000); -- SQL文
v_col varchar2(1000); -- カラム名
v_val varchar2(1000); -- 取得データ
v_tblname varchar2(20); -- テーブル名
v_RstExec integer;
v_CursorID integer;
begin
v_col := '';
v_tblname := 'sample';
-- 取得テーブルのカラムを取得
for rowcol in curcol(v_tblname) loop
-- 取得カラムをCSV形式に変換
if v_col is null then
v_col := rowcol.COLUMN_NAME;
else
v_col := v_col||'||'',''||'||rowcol.COLUMN_NAME;
end if;

end loop;
dbms_output.put_line(v_col);
-- SQL作成
v_sql := 'select '||v_col||' from '||v_tblname;

v_CursorID := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.NATIVE);
v_RstExec := DBMS_SQL.EXECUTE(v_CursorID);

LOOP
IF DBMS_SQL.FETCH_ROWS(v_CursorID) = 0 THEN
EXIT;
END IF;

DBMS_SQL.COLUMN_VALUE(v_CursorID, 1, v_val);
DBMS_OUTPUT.PUT_LINE(v_val);
END LOOP;

DBMS_SQL.CLOSE_CURSOR(v_CursorID);

end;
/

A 回答 (4件)

>DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.NATIVE);


の後に
DBMS_SQL.DEFINE_COLUMN( v_CursorID, 1, v_val,1000) ;
が必要では?
    • good
    • 2
この回答へのお礼

回答ありがとうございます。


DBMS_SQL.DEFINE_COLUMN( v_CursorID, 1, v_val,1000) ;
追加したらエラーが出なくなりました。
ただ、テーブル内の全レコードが表示されるかと思ったのですが1件しか表示されません。

お礼日時:2010/10/18 14:23

マニュアル


http://otndnld.oracle.co.jp/document/products/or …
によると2/の方のようにDEFINE_COLUMNが必要のようですけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。


declare部分だけに宣言すればいいのかと思っていました。

お礼日時:2010/10/18 14:26

#2です。

連続ですみません。
user_tab_columnsのtable_nameには大文字で格納されているはずなので、
'sample'ではなく'SAMPLE'とするべきではないでしょうか。
まぁ、'sample'のままだったら
>DBMS_SQL.PARSE(
の時点でエラーになるでしょうから修正済みなのかもしれませんが。
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。


ご指摘のとおり、サンプルコードのためテーブル名を小文字にしてしまいましたが、実際のソースでは大文字にしてあります。

お礼日時:2010/10/18 14:24

v_colとv_sqlはどうなってますか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。


v_colが sample_id||','||sample_name
v_sqlが select sample_id||','||sample_name from sample


v_sqlの値をコピペして単独で実行しても問題ありませんでした。

お礼日時:2010/10/18 14:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A