- PR -

DEVELOPER2000からの動的SQLについて

1
投稿者投稿内容
RYO
会議室デビュー日: 2006/08/30
投稿数: 3
投稿日時: 2006-08-30 17:18
はじめて投稿させて頂きます、RYOと申します。
よろしくお願いいたします。

DBMS.SQLパッケージを使用して動的SQLを実行したいのですが、
COLUMN_VALUE時にエラーとなってしまいます。
エラーの内容は「ORA-06562:外部の引数の型が列またはバインド変数の型に合致しません」です。
DATE型の時はうまくいきますが、CHAR型の場合のみエラーとなります。
この例ですと、取得する値はChar(10)で格納する変数も取得するテーブルのデータ型と同じにしております。
DEFINE_COLUMN_CHAR および COLUMN_VALUE_CHARを使用しても結果は同じでした。
分りづらい説明で申し訳ありませんが、よろしくお願いします。

<環境>
WindowsNT 4.0
Oracle8 Release 8.0.5
Developer2000

-------------------------------------------------------------------

PROCEDURE Exec_Query( p1,p2 ) IS

DMY NUMBER;
CURID INTEGER;
Sqlstr varchar2(5000);

loc_date date;
loc_col1 table1.col1%TYPE; -- 項目「col1」はChar(10) です


BEGIN

 CURID := DBMS_SQL.OPEN_CURSOR;

 Sqlstr := 'SELECT sysdate,col1 FROM table1 WHERE rownum = 1';
 DBMS_SQL.PARSE(CURID,sqlstr,1);

 DBMS_SQL.DEFINE_COLUMN(CURID, 1, loc_date);
 DBMS_SQL.DEFINE_COLUMN(CURID, 2, loc_col1, 10);

 DMY := DBMS_SQL.EXECUTE(CURID);

 WHILE DBMS_SQL.FETCH_ROWS(CURID)>0 LOOP
  DBMS_SQL.COLUMN_VALUE(CURID, 1, loc_date);  ←date型はうまくいく
  DBMS_SQL.COLUMN_VALUE(CURID, 2, loc_col1);  ←この部分でエラー(ORA-06562)
 END LOOP ;

END ;

[ メッセージ編集済み 編集者: RYO 編集日時 2006-08-30 17:29 ]
gaf777
会議室デビュー日: 2003/08/20
投稿数: 19
お住まい・勤務地: 大阪
投稿日時: 2006-08-30 18:20
こんにちは。

DBMS_SQL.COLUMN_VALUE(CURID, 2, loc_col1);

Char型の場合はサイズの指定が必要ですね。

[Googleで'ORA-06562'を検索]
http://www.google.co.jp/search?hl=ja&q=ORA-06562&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
RYO
会議室デビュー日: 2006/08/30
投稿数: 3
投稿日時: 2006-08-31 09:13
おはようございます。
ご回答ありがとうございました。

>DBMS_SQL.COLUMN_VALUE(CURID, 2, loc_col1);
>Char型の場合はサイズの指定が必要ですね。

DBMS_SQL.COLUMN_VALUEのパラメータはこのようになっており、
サイズ指定はできないようです。

DBMS_SQL.COLUMN_VALUE (
                         c IN INTEGER,
                         position IN INTEGER,
                         value OUT <datatype>
                         [,column_error OUT NUMBER]
                         [,actual_length OUT INTEGER]);

当掲示板に投稿する前にgoogleでの検索もして、似たような質問も実際あったのですが
解決されずじまいだったようです。
他に情報等がありましたら、よろしくお願いいたします。

[ メッセージ編集済み 編集者: RYO 編集日時 2006-08-31 09:13 ]
gaf777
会議室デビュー日: 2003/08/20
投稿数: 19
お住まい・勤務地: 大阪
投稿日時: 2006-08-31 13:16
引用:

gaf777さんの書き込み (2006-08-30 18:20) より:

DBMS_SQL.COLUMN_VALUE(CURID, 2, loc_col1);

Char型の場合はサイズの指定が必要ですね。




 申し訳ないです、上記は勘違いでした。

 問題のPL/SQL文ですが・・・
・%TYPEを使用せず明示的に型を宣言した場合でも再現しますでしょうか?
・SQL*PLUSからは実行可能でしょうか?
・COLUMN_VALUEのactual_lengthより実データサイズの取得は行なえますか?


※私の環境(Oracle 9.2.0)では再現できませんでした。
 お力になれずスイマセン。。。

RYO
会議室デビュー日: 2006/08/30
投稿数: 3
投稿日時: 2006-09-01 09:15
ご回答ありがとうございます。

・%TYPEを使用せず明示的に→ダメでした。
・SQL*PLUSからは実行可能か?→可能でした
・COLUMN_VALUEのactual_lengthより〜→行えませんでした。

会社で契約しているサポートにも相談してみたのですがdeveloper 6iでは
再現しないとのことでした。
Sql*plusで動作確認できたものがdeveloper2000では動かないということは、
やはりdeveloper2000では実現できないということでしょうかね・・・

いろいろと相談に乗っていただきありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)