動的にSQLを作成し、値を取得する方法について

このQ&Aのポイント
  • Pro*Cでテーブル名を動的に与え、カラムの1つであるシーケンス番号の最大値を取得する方法について述べています。
  • 実行するSQL文の中には「%s」を含んでおり、sprintfの第3引数でテーブル名を渡しているので、buf1の中身はそのままSQL*PLUSで実行できる内容となっています。
  • 取得したいデータを直接SQL*PLUSで実行すると0ではない値となるのですが、どのようにすれば値が取得できるかについて質問しています。
回答を見る
  • ベストアンサー

動的にSQLを作成し、値を取得する方法について

Pro*Cでテーブル名を動的に与え、カラムの1つであるシーケンス番号の最大値を取得しようとしています。 ネットで調べたところ、 EXEC SQL DECLARE S1 STATEMENT; sprintf(buf1, "実行するSQL文", ); EXEC SQL PREPARE S1 FROM :buf1; EXEC SQL EXECUTE S1 INTO :取得結果格納領域; という構文で出来るということがわかったのですが、最後のところで、取得結果格納領域に値が入りません(正確には初期値「0」が入ります)。 取得したいデータを直接SQL*PLUSで実行すると0ではない値となるのですが、どのようにすれば値が取得できるかをご教授いただければと思います。 実行するSQL文の中には「%s」を含んでおり、sprintfの第3引数でテーブル名を渡しているので、buf1の中身はそのままSQL*PLUSで実行できる内容となっています。 それぞれのEXEC SQLの後にSQL終了コード(sqlca.sqlcode)を取得しましたが、どれも0(正常終了)で終わっていました。 どうかご教授のほど、よろしくお願いします。

  • utf7
  • お礼率50% (4/8)

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 Pro*C のマニュアルをちょっと見てみました。 Pro*C で問い合わせの動的SQL を実行するのであれば、 カーソルを使って、OPEN, FETCH, CLOSE するのが正解のようです。 PL/SQL であれば、 Execute Immediate SQL文 INTO .... USING .... という方法もあるようです。 バージョンが不明ですが、どちらも使用できると思います。

utf7
質問者

お礼

ご回答ありがとうございます。 必ず1件取得のためFETCHは必要ないかなと思っていましたが、こちらでもPro*Cのマニュアルを見ながら作成したところ、うまく取得することが出来ました。 アドバイスどうもありがとうございました。

関連するQ&A

  • PHPでSQLサーバ(smalldatetime型)の値を取得

    お世話になります。 PHPでSQL2000からselect文で値を取得しようとしています。 条件は、smalldatetime型の値が格納されているフィールドが今日より 古い場合です。 SQLサーバのsmalldatetime型は、最初の2バイトで1900年01月01日からの日数、残りの2バイトで午前0時からの分数を格納するとマニュアルにありました。 ですので、1900年から今日までの日数を取得し、smalldatetimeフィールドの値と比較すればよいのかと思ったのですが、うまくいきません。 $today = time() / 60 / 60 / 24 + 70 * 365 //PHPのUNIXタイムは1970年からのため、70*365 をプラス。 $sql = "select * from table where smalldatetime <= ".$today; どなたかアドバイスお願いします。

    • ベストアンサー
    • PHP
  • SQLでのファイルの更新日時の取得方法

    いつもお世話になっております。 現在SQLの勉強をしているのですが、テーブルのファイルの更新日時の取得方法(select文)が分からず行き詰まっております。教えて頂けないでしょうか。 なお、SQL*PLUSを使用しています。

  • SQL文の実行速度の確認方法

    Oracle SQL*Plusにて、SQL文の開始から値取得までの実行速度の確認をしたいと考えております。 秒単位だけでもOKですので、どなたか確認方法について教えて頂きたくお願いします。

  • 動的SQLのCOUNTのとり方

    動的SQLで、DBの件数を取得したいのですが、 うまく取得できず困っています。 教えてください! 以下の様に、記述しているのですが取り方間違っていますか? EXEC SQL EXECUTE statment INTO :CNTNUM; PREPEAした、statmentには SELECT COUNT(*) FROM テーブル名 where kbn = 3; と、ごくごく普通のSELECT COUNT文です。 cnt_numは、int型のホスト変数で宣言しています。 デバックしながら実行すると、cnt_numの値は初期化した時の 0のままです。実際取得した件数が0件なのかもと思い 初期化時に3を代入して実行したら、やはり値は3でした。 なので、件数が取得出来ていないようです。 オラクルエラーにもならず、次の処理へ流れていってしまいます。 知っている方、教えてください。

  • SQLから取得した値をEXCELへ表示したい

    お世話になります。 お分かりになる方教えてください。 VB.NETでSQLに繋いで画面から入力されたテキストボックスの値をパラメータに 結果がワークテーブルに格納されるストアドを呼び出します。 ストアドの結果(ワークテーブルの値)をSELECTして 今はダイアログに仮に出している状態です。 それからOLEDB接続を使ってEXCELにデータを表示したい (セルに結果を貼り付けたい)のですが データのやり取りがうまくいきません。 System.Data.SqlClient.SqlDataReaderで取得した値をSystem.Data.OleDb.OleDbDataReaderに移したいのですが よくわかりません。 どなたか教えていただけませんでしょうか。 よろしくお願いします。

  • SQLで取得したフィールドをSQL文として利用

    お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。

  • JavaとSQL(Oracle)を使って値を取得する方法ってありますか

    JavaとSQL(Oracle)を使って値を取得する方法ってありますか? SQLでテーブルの中の一行と 何個かパラメータを受け取ってそれを1行とみなして 行ごとに比べてそのもしテーブルの中に同じ行があったら Trueが返ってくるなんてことは出来るのでしょうか? Trueでなくても数値でも文字でも 一致する行があった場合となかった場合で違う結果が返ってくるようにしたいのですが そんな方法ありますでしょうか? なかなか説明しづらくわかりづらい質問かもしれませんが よろしくお願いいたします

  • PL/SQLで実行したSQLのログの取得について

    ASP(ActiveServerPage)より、PL/SQLのFunctionを実行し、Oracleの複数のTABLEを更新しようとしています。 ASPから実行する際には、引数を渡し、その引数をSQL実行の条件としていますが、実際に実行されたSQL文のログを取得したいのですが、どうしたらよいでしょうか? 何か良い方法をお教えいただけますよう、よろしくお願いいたします。 [実行環境] DB:Oracle8i

  • テーブル名をカラムとして取得する方法

    テーブル名をカラムとして取得する方法はありますでしょうか? オラクル8とVB6でプログラムを組んでいます。 例 TABLE Aの内容 カラム1 1 2 3 TABLE B カラム1の内容 4 5 6 SQLは簡略化してかきます。下記のSQLを実行した場合、 select A.カラム1 from A union select b.カラム1 from b 1 2 3 4 5 6 を取得できます。 例えば、上記で、SQL実行後、 下記のような値を取得したいです。 1 ,Aのテーブルだよ 2 ,Aのテーブルだよ 3 ,Aのテーブルだよ 4 ,Bのテーブルだよ 5 ,Bのテーブルだよ 6 ,Bのテーブルだよ それぞれのテーブルの名前を別名で結果に格納したいのです。 何か方法はありますでしょうか? なければ、unionせずに、2回SQLを発行し、それぞれに、 プログラム上で、「Aのテーブルだよ」を後で挿入したいと思っています。

  • テーブルから特定の値を取得する方法を探しています

    OracleのPL/SQLを勉強し始めたものですが、質問させていただきます 。 あるテーブルにINSERT文を使ってデータを追加するストアドファンク ションを作成しています。 そのINSERT文の中に、ある列(NUMBER型)の今現在の最大値にプラス1し て新規にレコードを追加するという処理を入れる方法を探しています 。 BEGIN INSERT INTO USER.テーブル1 VALUES (項目1, 項目2, 項目3 ); END 項目2に対応するテーブルの列の最大値を取得し、項目2に値を入れるには どのような方法があるでしょうか? 方法や手順等を教えてくださる方お願いします。

専門家に質問してみよう