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

このQ&Aのポイント
  • PRO*Cのプログラムで、テーブル名とカラム名をパラメータで受け取って、ホスト変数(バインド変数?)に代入して、それぞれ、SELECT文等で使用できますか?PL/SQLなら出来るでしょうか?
  • PRO*Cでテーブル名とカラム名のパラメータを受け取り、バインド変数に代入して、SELECT文等で使用できる方法を教えてください。また、同様のことはPL/SQLでもできるのでしょうか?
  • PRO*Cのプログラムで、テーブル名とカラム名をパラメータとして受け取り、バインド変数に代入して使用する方法を教えてください。また、同じことは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 ;

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

  • ベストアンサー
  • ryusei2
  • ベストアンサー率24% (45/184)
回答No.1

おそらく、できません。 PRO*Cは詳しくないですが、PL/SQL, Pro*Cobolではテーブル名やカラム名を可変にする場合は、動的SQLにするしかありません。 これは、オラクルの基本的な仕様だと思います。

関連するQ&A

  • 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)

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

    変数が選択リストにありません 下記のコードを実行すると「変数が選択リストにありません」というエラーが出てしまいます。 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; /

  • Pro*C NUMBER型のカラムにホスト変数を使用してINSERTしたいとき

    テーブルの定義 ----------------------------------------- TableName ColmunName 型    Length ----------------------------------------- T1     C1     VERCHAR2 20       C2     NUMBER  16(0) ----------------------------------------- プログラム <stdio.h> <string.h> <sqlca.h> void main(void){   char statement[1024 + 1];   /* ホスト変数定義 */   EXEC SQL BEGIN DECLARE SECTION;     VERCHAR hC1;     <?????> hC2;             ← ココです(^^;   /* INSERT文の定義 */   strcpy(statement, "INSERT INTO T1 (C1,C2) VALUES (?,?)");   EXEC SQL PREPARE S1 FROM :statement;    /* メイン(ループ) */   while(1)     hC1 (ファイルから読込んだ値を代入)     hC2 (ファイルから読込んだ値を代入)     EXEC SQL EXECUTE S1 USING :hC1, :hC2;   } } <質問> 上記のテーブルに、あるファイルから読込んだデータを、 ホスト変数hC1、hC2に代入して、 INSERTしたいのですが、 カラムC2の型がNUMBERの16桁のため、 ホスト変数hC2の型を何で定義したら良いのか わかりません。 (ちなみに、ファイルはテキストで読込みます) 何か良い方法があるのでしょうか?

  • CでSQLのテーブルを読む

    SQLのテーブルがあります。 レコードを1行ずつ読むソースを教えてください。 データベースはさっぱり分かりません。 create table mytable (  name text,  age int ); このテーブルからint型のageを列挙したいと思います。 intを読むわけですから EXEC SQL BEGIN DECLARE SECTION; int i; EXEC SQL END DECLARE SECTION; が必要ですよね。あとはさっぱり分かりません。

  • pro*c で pl/sql に変数を渡すとora-01458発生

    oracle初心者です。よろしくお願いします。 oracleのバージョンは 10.1.0.2.0 開発言語はpro*c pl/sql です。 テキストファイルを処理するAPを作成しています。 ディレクトリオブジェクト名を、pro*cからpl/sqlを呼び出す際に変数として渡していますが、実行するとora-01458エラーが発生してしまいます。 pro*cのコーディングは以下の通りです。 EXEC SQL BEGIN DECLARE SECTION; char Pass[50+1]; char Txtnm[20+1]; int nStatus; VARCHAR vErrMsg[100+1]; VARCHAR vErrCode[10+1]; EXEC SQL END DECLARE SECTION; ZeroMemory( Pass, sizeof( Pass ) ); strcpy( Pass, "DIR_A" ); ZeroMemory( Txtnm, sizeof( Txtnm) ); strcpy( Txtnm, "TEST.txt" ); EXEC SQL EXECUTE BEGIN  proc9999( :Pass, :Txtnm, :nStatus, :vErrMsg, :vErrCode ); END; END-EXEC; しかし、このpl/sqlをsqlplusから下記の内容で実行すると正常に動作します。 DECLARE in_file_dir VARCHAR2(255) :='DIR_A'; in_file_name VARCHAR2(255) :='TEST.txt'; io_sts number; io_msg VARCHAR2(255); io_msgcd VARCHAR2(10); BEGIN PROC9999( in_file_dir, in_file_name, io_sts, io_msg, io_msgcd ); END; 同じことをしていると思うのですが何故pro*cではエラーになるのでしょうか?

  • Cソースにホスト変数を宣言したヘッダをインクルード方法

    C言語ソースにホスト変数を宣言したヘッダをインクルードする記述を教えてください。下記の記述をしたのですが、エラーになります。 EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; #include "../host_header.h" EXEC SQL END DECLARE SECTION;

  • バインド変数について

    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; どんな事でもかまいませんので回答よろしくお願いします

  • プロシージャで変数をテーブル名として使用したい

    いつもお世話になります。 以下のような感じで変数をテーブル名として参照したいのですが、できますでしょうか。 --ここから create proc proc_test @tbl_name varchar(30) as select count(*) from [dbo].[@tbl_name] --ここまで ver:SQL Server2000 宜しくお願いいたします。

  • PLSQLのバインド変数の件です。

    こんにちわ。 いま,VBからテーブル名と列名をバインド変数としてPLSQLに渡しました。 そこで,PLSQLのなかで, v_Sql := 'UPDATE :Table_Name SET :Column_Name = :After_Change_Value WHERE :Column_Name = :Before_Change_Value ' ; のようにSQLを組み立て, DBMS_SQL.PARSE(v_Cursor, v_Sql, DBMS_SQL.NATIVE); でSQLを解析したところ,ERR-903となってしまいます。 ちなみに,:Table_Nameと:Column_Nameにテーブル名と列名をそのまま記述したところ,上記のエラーはパスできます。 VBからPLSQLにテーブル名と列名を変数として渡して,PLSQLのなかでSQLを解釈するにはどうすれば良いでしょうか? 教えてください。 宜しくお願いします。

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

    はじめまして。思いっきり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部分が数値なんですが、どのように取扱いすべきなんでしょうか。

専門家に質問してみよう