• ベストアンサー
  • すぐに回答を!

INSERT文の書式

oracleに触るの初めてなのにストアドなんて書くことに・・ 助けを頂けたらと思います。 ストアドの中でですが・・・・ INSERT文の中ではテーブルの項目が2つ以上あるとき、 変数にその2つ以上分の値を文字列として入れておいて 、その値をINSERT文に流すことってできないのでしょう か? test_str := (' ''テスト1'' , ''テスト2'' '); insert into TestTable (test1 , test2 ) values (test_str); 上記のように書くと PL/SQL: ORA-00947: 値の個数が不足しています。 とのエラーが帰ってきます。 上記のように変数を使って下記のように解釈させたいのですが無理なのでしょうか? insert into TestTable (test1 , test2 ) values ('テスト1','テスト2'); それではお願いします。 失礼いたします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数3874
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.2

ストアドでなくVBあたりから文字列を渡すのであればできるでしょうが、PL/SQLでのプロシージャの記述は厳格に解析するので無理と思いますよ。1つの文字列はシングルクォーテーションでくくってもカンマを打っても1つの文字列と解析されます。第一そうでないと、カンマやシングルクォーテーションをデータとしてINSERTできません。 ところで、なぜ上記のような書き方をしたいのでしょうか。変数を増やしたくないからとか?2つの文字列を1つの文字列で処理しようとするのはけっこうイレギュラーな操作になります。 上記のような書き方はできませんが、なぜそうしたいと思ったのかを書いたら、誰かがそれ以外の何かしらの方法を教えてくれるかもしれません。(質問のタイトルを目にしてみんな見に来るので、別の質問として新たに投稿したほうがいいかもしれませんが)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 できないということですね。理由がはっきりわかって納得です。 そのような書き方がしたい理由なのですが、、 もともと、一つにつながっている状態のデータを受け取るので、それを置換したら簡単にできるかな。と思っただけです。 困り度を3にしたのはこの件で先輩ができる!!というのにOracleの本をず~っと読んでもできなさそう。で言い争いになったので早く結論がほしかったのです。w ありがとうございました。

関連するQ&A

  • PHP/MySQL INSERT文について。

    PHP/MySQL INSERT文について。 こんばんは。 PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。 そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。 簡易的な質問内容としては 全てのカラムに対する値の挿入は可能なのに カラムを指定して値を挿入しようとしたらエラーが出ます。 データベースの設定はテーブル名【TESTtable】 フィールド 種別 NULL 属性/その他 AAA int(6) No UNSIGNED ZEROFILL / auto_increment BBB int(4) Yes CCC int(4) Yes DDD int(4) Yes PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。) INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50) とした場合は問題無くテーブルに書き込みされますが カラムを指定して INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50) とした場合、書き込みが行われません。 INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50') 等、色々試してみましたが不可能でした。 カラムAAAはauto_incrementにりますので毎回書き込みされますが BBB、CCC、DDDは書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • smalldatetime型へのInsert

    ストアド内でsmalldatetime型の項目にGetDate()関数を使用してInsertしよとしているのですが、 なぜか「STRING または BINARY データは切り詰められました。」というエラーになってしまいます。 ストアドを使用しないで直接Insert文を流すと正常に登録できます。 ちなみにInsert文はごく単純で INSERT INTO テーブル名(項目名1(varchar),項目名2(varchar),項目名3(smalldatetime)) VALUES(@変数1,@変数2,GetDate()) という感じです。 どなたか分かる方いましたら助言お願いします。

  • 「’」を含むINSERT文

    掲題にある通り「'」を含むINSERT文を作成しているのですが、 コマンドが不正でエラーになってしまいます。 以下のようなINSERT文を発行したいのですがどのように記述すればよいのでしょうか。 INSERT INTO TEST(A,B) VALUES('001',***); ***には「'ABC'」という値をセットしようとしています。 INSERT後のB列には「'ABC'」というように「'」も 含む形にしたいのですが、ご教授頂けないでしょうか。 よろしくお願い致します。

その他の回答 (1)

  • 回答No.1

test_str1 := ('テスト1'); test_str2 := ('テスト2'); insert into TestTable (test1 , test2 ) values (test_str1,test_str2); じゃだめなの? PL/SQL: ORA-00947: 値の個数が不足しています はインサートする列が2つあるのに値が1つしかないと言うことです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

すばやい解答ありがとうございます。 ダメ・・ということは無いです。 質問の内容のような書き方をできたらしたかったので・・ 質問したやり方ではできないということなので、この方法でやります。 ありがとうございました。

関連するQ&A

  • Using temporary; Using filesort を回避したい

    はじめまして。よろしくお願いします。 下記の場合、Using temporary; Using filesort を回避するには どうしたらよいでしょうか。 次の 2 つのテーブルがあります。 CREATE TABLE `test1` ( `f1` int(11) NOT NULL, `f2` int(11) NOT NULL, PRIMARY KEY (`f1`,`f2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test1` VALUES ('1', '2'); INSERT INTO `test1` VALUES ('1', '3'); INSERT INTO `test1` VALUES ('1', '4'); INSERT INTO `test1` VALUES ('2', '1'); INSERT INTO `test1` VALUES ('2', '3'); CREATE TABLE `test2` ( `f1` int(11) NOT NULL, `f2` varchar(20) default NULL, `f3` varchar(20) default NULL, PRIMARY KEY (`f1`), KEY `ix_f2_f3` (`f2`,`f3`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test2` VALUES ('1', 'A', 'a'); INSERT INTO `test2` VALUES ('2', 'B', 'b'); INSERT INTO `test2` VALUES ('3', 'C', 'c'); INSERT INTO `test2` VALUES ('4', 'D', 'd'); 次の SELECT を実行すると Using temporary; Using filesort が 現れてしまいます。 explain select test2.f2, test2.f3 from test1, test2 where test1.f1 = 1 and test1.f2 = test2.f1 order by test2.f2, test2.f3; order by ... をなくすと問題ないのですが、ソートは必要です。 複数のキーに対してORDER BYを実行する場合 インデックスを使用できないとあるので ix_f2_f3 は使用されず Using filesort となるのはわかるのですが、 Using temporary となる理由と回避方法がわかりません。 ご教示よろしくおねがいいたします。

  • ストアドプロシージャに複数のSQL文を書く

    いつもお世話になります。 OS:Windows XP SQL Server2005 ExpressEditionです。 テーブル名:testTable 列 :(1)number(intで主キーで自動採番)(2)name(nvarchar(50)) ストアドプロシージャを以下のSQL文で作成しました。 insert into testTable (name) values(''); update testTable set name = ltrim(str(SCOPE_IDENTITY())) + '_table' where number=SCOPE_IDENTITY(); (説明) インサート文;(セミコロンを打っています) アップデート文;(セミコロンを打っています) なぜこんなことをするかと言いますと、 自動採番で取得した番号を列:nameの内容の一部にしたいためです。 つまり、列:numberが12で採番されたとすると列:nameは 12_table と したいためです。 ltrimをかけていますのは、str(SCOPE_IDENTITY())の結果、数値の左 に空白が入ってしまうためです。(intのバイト数ほどでしょうか) 想定どおりの値がnameに入っております。 しかしこれは邪道ではないかと危惧しております。 よろしくご教授をお願いいたします。

  • Viewに対して更新したときもとのTableの値はどうなる?

    SQLの初歩的な質問す。 create view testview as select a,b from testtable ; というようにtestviewを作成して、 insert into testview ( a,b )values( 'aaa','bbb' ) というようにtestview にデータを作成したとき、 testtableの値も更新されるのですか? よろしくお願いします。 以上

  • [PostgreSQL]別DBのテーブルのSelect、Insert

    お世話になっております PostgreSQL8.1を使用しまして あるテーブルにInsertがかかると その内容を判断し別のテーブルに insertをする仕組みが必要になり いろいろ試してみて TriggerとFunctionを使用すれば 実装できるとこまでわかりました。 ただしその別テーブルが別DBに配置されているので そのテーブルに以下のようなInsert文を発行しても エラーになってしまいます。 Insert into SUB_DB.TEST_TBL values('test','date'・・・・); (SUB_DB:ストアドを実行しているのとは別のDB) ストアドから別テーブルを参照更新する手段を ご存知のかたご教授いただけますでしょうか。 よろしくお願いいたします。

  • PL/SQLの初歩的な質問その2

    失礼します。 先日は似たような質問でお世話になりました。 またPL/SQLについての質問です。 あるTBLに、以下のような感じでレコードが入っていたとします。 TESTtable test1(PK)(NUMVER型) test2(NUMVER型) --------------------------------------- 1 10 2 11 3 12 4 10 ここで以下のSELECT文を実行 SELECT test1 , test2 FROM TESTtable WHERE test2 = IN(10,12) この時、test2が10だったら20の数値に変換後test2として抽出し、 test2が12だったら22の数値に変換後test2として抽出する為には どのようなSELECT文になるでしょうか? 宜しくお願いします。

  • [materialized]マテリアライズドビューの検索

    マテリアライズドビューを作成し、selelct文を発行致しましたら、 『"TEST2":無効な識別子です。』とエラーが出てしまいました。 下記の様に、テーブル、View、マテリアライズドビューを作成した後、 select文を作成しました。 View、マテリアライズドビュー、select文のいずれかで間違いが有ると思うのですが、どの様に修正を行えば良いのかが分かりません。 ですのでエラーを回避する方法を教えて頂きたく思っております。 宜しくお願い致します。 ■テーブル1作成 Create table TEST_TBL1 ( Test1 nchar(6), Test2 nchar(6) ); ■テーブル2作成 Create table TEST_TBL2 ( Test1 nchar(6), Test2 nchar(6) ); ■レコード追加 INSERT INTO TEST_TBL1 (Test1, Test2) VALUES (1,1); INSERT INTO TEST_TBL1 (Test1, Test2) VALUES (2,2); INSERT INTO TEST_TBL2 (Test1, Test2) VALUES (3,3); INSERT INTO TEST_TBL2 (Test1, Test2) VALUES (4,4); ■ビュー作成 create view TEST_VIEW as select A.rowid AROWID,A.Test1 ID,A.Test2 TITLE,3 MARKER from TEST_TBL1 A union all select B.rowid AROWID,B.Test1 ID,B.Test2 TITLE,4 MARKER from TEST_TBL2 B; ■ログ作成 create materialized view log on TEST_TBL1 with sequence,rowid (Test1, Test2) including new values; create materialized view log on TEST_TBL2 with sequence,rowid (Test1, Test2) including new values; ■マテビュー作成 create materialized view TEST_MVIEW REFRESH FAST on demand as select * from TEST_VIEW; ■データ抽出 Select TEST1 FROM TEST_MVIEW WHERE TEST2 = '1'; ご回答の程、宜しくお願い致します。

  • php mysql INSERT

    mysqlのデータ登録の際に値が空だとエラー文が表示されてしまいます。 エラー文は You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 にでます。 なお、mysqlのバージョンは5.1です。 試行錯誤で試したのですが、なかなかできないためわかる方がいましたら宜しくお願いします。 ソースは foreach((array) $test1 as $key => $val){ if($val !== "" && $test2[$key] !== "") { $vals .= ","; $vals .= "('$val','$test2[$key]')"; } } if($vals !== "") { $vals = trim($vals,','); $testQuery = sprintf("INSERT INTO `home_scorer` (`test1`,`test2`) VALUES" .$vals); $testResult = mysql_query($testQuery, $link) or die(mysql_error()); } test1 と test2に値が入っていれば登録はさせるのですが、値が入っていないときはINSERTしない状態にできればと思います。 宜しくお願いします。

    • 締切済み
    • PHP
  • OracleでINSERT文のループ

    INSERT文で何万件ものデータをテーブルに挿入したいのですが、 SUBSTRBまたはSUBSTR関数で何バイト分あるいは何文字分抽出して その部分の値をインクリメントさせる記述のしかたがわかりません。 INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003000','2000','2','85000','001','55555','10','test','1'); INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003001','2000','2','85001','001','55555','10','test','1'); INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003002','2000','2','85002','001','55555','10','test','1'); INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003003','2000','2','85003','001','55555','10','test','1'); ・ ・ ・ と、いう感じで、IDとNOのみ、値をインクリメントさせて大量のデータを 挿入したいのですが、SUBSTRB関数やループなどを使って効率的に行うやり方がわかりません。どなたか、ご教授ください。

  • Javaソース上でのきれいなSQLの書き方

    Javaのソース上でSQL文を書くと 読みにくく、書きにくくなってします。 特に表名や、列名などを変数で指定する場合は見苦しくてたまりません。 これぞという綺麗な書き方をご存知ないですか? 以下は自分で試してみた例です。 ex. 一般的? String tbName = "TestTable" + 1; String exName = "Who"; String sql = "INSERT INTO " + tbName + "(" + " Timestamp," + " Name) " + "VALUES(" + " CURRENT_TIMESTAMP," + " '" + exName + "');" ex. 変数置換 無駄な処理はありますが。 String tbName = "TestTable" + 1; String exName = "Who"; String sql = "INSERT INTO tbName(" + " Timestamp," + " Name) " + "VALUES(" + " CURRENT_TIMESTAMP," + " 'exName');" sql.replaceAll("tbName", tbName); sql.replaceAll("exName", exName); ex.別ファイルファイル読み込み + 変数置換

    • ベストアンサー
    • Java
  • INSERT文(2)について

    お願い致します。 ORACLE9iを使用しています。 INSERT INTO tableA(AA,BB,CC,DD,・・・) VALUES (AA,BB,CC,DD・・・) ************************** 項目  長さ AA 11,3 BB 11,3 CC 11,3 ・ ・ ************************** 現在データ(VALUES句内部) AA→0.00000000まで ・ ・ *************************** 状態です。 SQL文上のINTO句とVALUES句の値の対応は取れています。 VALUES句が現在は少数点以下切捨てしてない状態な為、ORACLE項目の長さ以上に値が指定されているのですが、これが原因でエラーになっているのでしょうか? エラーメッセージ:「VALUESキーワードがありません」 お願い致します。