• 締切済み

SELECT文の結果をDEFINEの値として使用したいのですが。。。 [Oracle9i]

こんにちは。 test.sqlでバインド変数として使用されている"hensu"に対して、SELECT文の結果を代入したいと考えています。 そこで、DEFINEで下記のようにセットしてみようとしたのですが、"hensu"には"hensu_id"という文字として入ってしまうようです。 DECLARE hensu_id number ; BEGIN select min(id) into hensu_id; END; / DEFINE hensu =hensu_id @c:\test.sql 初歩的な質問ですみませんが、宜しくお願いします。

  • Oracle
  • 回答数3
  • ありがとう数2

みんなの回答

  • jmh
  • ベストアンサー率23% (71/304)
回答No.3

こんにちは。 column tmp new_value hensu select 'atai' tmp from dual; select * from dual where 'atai' = '&hensu';

回答No.2

>test.sqlでバインド変数として使用されている"hensu"に対して、SELECT文の結果を代入したいと考えています。 理解に間違いがあるので、その訂正から.. 「DEFINE hensu =」で定義するのは、バインド変数でなく、ユーザ変数です。 SQL*PLUSのスクリプト上で、変数(&~)として記述した箇所を置き換えるものです。 本当に、test.sqlでバインド変数(hensu)が使われているのなら、 var hensu number; begin select min(id) into :hensu from ~; end; / @c:\test.sql で良いはずです。 そうでなくて、test.sqlで使われているのは、ユーザ変数(&hensu)ということなら 実現するのが、ちょっと難しい。 spool機能を利用して、小細工するとかしないと、うまくいかないと思います。

michelle_k
質問者

お礼

すみません。ご指摘のとおり私の勉強不足でした。 test.sqlで使われているのはユーザ変数の方です。 そうですか。。。と、すると簡単にはいかないわけですね? まずはspool機能について勉強してみます。 ありがとうございました。m(_ _)m

  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.1

バインド変数を参照するには、変数名の前にコロンを付けるはず。 DEFINE hensu = :hensu_id でどうですか?

michelle_k
質問者

補足

回答ありがとうございます。 早速、変数名の前にコロンをつけて実行してみたところ、「PL/SQLプロシージャが正常に完了しました。」が表示された後、test.sqlが実行された際、このような↓エラーがでます。 SP2-0552: バインド変数"hensu_id"が宣言されていません。 結果、セットされた値は、":hensu_id"でした。 そこで、test.sql側に"variable hensu_id number;"を追加してみましたが、SP2-0552エラーはでなくなりましたが、セットされた値は同じでした。 END; / で区切った時点で、変数は無効になるのでしょうか?

関連するQ&A

  • バインド変数について

    PL/SQLのバインド変数について調べていますが理解できず困っています。 [理解内容] 1.利点  :SQL文の検索にバインド変数を利用すると、同一のSQLとして実行できる   ⇒ 繰り返し処理(ループ)では有効 2.使用方法  :静的SQL・動的SQLで使用可能   [疑問点]   静的SQLではバインド変数をどう宣言すればよいですか?   [SQL*Plus]・[動的SQL]は例文がありました   ●SQL*Plusでの宣言方法    (例)     SQL> set null '<null>'     SQL> set head off     SQL> variable var_at_sqlplus number   ●動的SQLの記述方法    (例)     declare      v_sql varchar2(256);      v_id varchar2(3);     begin      v_sql = 'select id into :v_id from test';      execute immediate v_sql into v_id;     end;   ●静的SQL ・・・【 エラーになる 】     declare      variable v_id varchar2(3);     begin      select id into :v_id from test'     end; どんな事でもかまいませんので回答よろしくお願いします

  • SQL*Plus内でPL/SQL、SQLを実行するシェルスクリプトを書

    SQL*Plus内でPL/SQL、SQLを実行するシェルスクリプトを書いています。 イメージ sqlplus scott/tiger << EOF   declare     aaa number;   begin     -- *1     select col1 into aaa from test1;   end;   /   -- *2   define a=1   define b=1   @test.sql EOF ここで*1にて例えば複数行が返ってくるなどのエラーが 発生した場合、*2以降のSQLを実行せずにSQL*Plusから抜けたいのですが どのようにすればよいかわかりますでしょうか。 whenever sqlerror exit 255 などはPL/SQL内の論理エラーはハンドリングしてくれないようです。 よろしくお願いします。 それかdefineや@マーク指定によるsqlファイルの取り込みを PL/SQLの中で実行できる方法を教えていただく方法でも 当方が実施したいことはできるのでそれでもかまいません。

  • PRO*Cでテーブル名にバインド変数は使えますか?

    PRO*Cのプログラムで、テーブル名とカラム名をパラメータで 受け取って、ホスト変数(バインド変数?)に代入して、 それぞれ、SELECT文等で使用できますか? PL/SQLなら出来るでしょうか? EXEC SQL BEGIN DECLARE SECTION; varchar t_name[64]; /* テーブル名 */ varchar col_name[64]; /* カラム名 */ EXEC SQL END DECLARE SECTION; /* 中略 パラメータの値をホスト変数に代入する処理を行う */ ↓以下のように出来ますか? SELECT :col_name FROM :t_name ;

  • 【PL/SQL】IF文( EXIT WHEN )でプロシージャの実行結果から判断させたい

    Oracleで動くPL/SQLを作成してます。 プロシージャの実行結果をIF文に入れて、 実行結果からさらに処理を走らせたいのですが エラーが出てしまいます。 例) CREATE PROCEDURE TEST1(id NUMBER) BEGIN select NAME from TBLA where DID = id and ROWNUM <= 1; END; CREATE PROCEDURE TEST2(id NUMBER) BEGIN LOOP EXIT WHEN ( TEST1(id) is not null );☆ここがうまくいかない。 id := id + 1; END LOOP; END; TEST2のCreate時にTEST1は関数として存在しないというエラーメッセージが表示されます。 IF(EXIT WHEN)文中からはずして TEST1(id)のみの実行では、エラーが起きず IF文に入れるとエラーが起きるところまでは分かりました。 例はかなり簡略しているのですが、 どうしたらうまく動くのか分かる方がいれば 教えてもらいたいです。

  • SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?

    初めてこちらで質問させていただきます。 どうぞよろしくお願いします。 早速ですが、 現在ストアドファンクション(PL/pgSQL)にて以下のような形になっています。 変数d1,d2,d3に値をセットするにあたり テーブルt1を3回スキャンしています。 これを1回のスキャンでセットするような 方法はないのでしょうか? DECLARE d1 integer; d2 integer; d3 varchar(10); begin select min(c1) into d1 from t1; select min(c2) into d2 from t1; select min(c3) into d3 from t1; 各種処理 return v; end; 気持ち的には以下のようなSQLを書きたいのですが、 syntax error となります。 (NG例) select min(c1) into d1,min(c2) into d2,min(c3) into d3 from t1; 何か良い案がありましたら教えてください。 「それは出来ません」と言う回答でもありがたいです。 ※あきらめがつくので。。 それではよろしくお願いします。

  • Pro*cのバインド変数をカンマ区切りで指定できますか?

    Pro*cのバインド変数で下記のようなwhere句のinでカンマ区切りを指定することはできないのでしょうか? Oracle9iです。 適当な書き方で申し訳ありませんがよろしくお願いします。 ------------------------ EXEC SQL BEGIN DECLARE SECTION; const char *bindAAA; EXEC SQL END DECLARE SECTION; // bindAAAバインド変数に'1,2,3'という具合に格納 ↓のSQLを実行したい select * from AAA where BBB in (:bindAAA)

  • PL/SQLのエラー処理について

    PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin      insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。

  • 変数の取り扱いについて

    はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。

  • Select結果をSelect

    お世話になります。 以下のSQL文のイメージでselectの結果をさらにselectしたいのですが”subquery has too many columns”というエラーを吐かれます。 Postgreに合った書き方がお分かりでしたら教えてください。 よろしくお願いします。 select * from [DB名] where [パスワード] = 'test' IN ( select * from [DB名] where [ユーザID]='1111' order by [更新日] desc limit 3) [やりたいこと] テストDBからユーザIDが1111の行を更新日をキーに降順で並べ、先頭から3行分を取り出す。 その3行からパスワードが"test"のものをselectしたい。

  • PL/SQLの基礎的な質問ですが・・

    こんばんわ! PL/SQLの超初心者なのですが、以下ように「aaa」という変数に一つ目のselect文の結果を代入して、二つ目のselect文のテーブルにその名前を当てはめたいだけなのです。 DECLAER aaa VARCHAR2(30) BEGIN select max(TABLE_NAME) into aaa from ALL_TABLES Like '***'; select * from aaa END; ところが、結果は「表またはビューが存在しません」となります。 このような使い方はできないのでしょうか? どなたかご教示いただけませんでしょうか?宜しくお願いします。