PRO*Cでテーブル名にバインド変数は使えますか?
- 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 ;
- goo393
- お礼率22% (6/27)
- その他(プログラミング・開発)
- 回答数1
- ありがとう数0
- みんなの回答 (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)
- ベストアンサー
- Oracle
- 変数が選択リストにありません
変数が選択リストにありません 下記のコードを実行すると「変数が選択リストにありません」というエラーが出てしまいます。 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; /
- ベストアンサー
- Oracle
- 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・C++・C#
- 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ではエラーになるのでしょうか?
- ベストアンサー
- Oracle
- 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; どんな事でもかまいませんので回答よろしくお願いします
- ベストアンサー
- Oracle
- プロシージャで変数をテーブル名として使用したい
いつもお世話になります。 以下のような感じで変数をテーブル名として参照したいのですが、できますでしょうか。 --ここから create proc proc_test @tbl_name varchar(30) as select count(*) from [dbo].[@tbl_name] --ここまで ver:SQL Server2000 宜しくお願いいたします。
- 締切済み
- SQL Server
- 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を解釈するにはどうすれば良いでしょうか? 教えてください。 宜しくお願いします。
- ベストアンサー
- Oracle
- 変数の取り扱いについて
はじめまして。思いっきり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部分が数値なんですが、どのように取扱いすべきなんでしょうか。
- ベストアンサー
- SQL Server