SQL文でSUBSTRを使いたい時のエラーと解決方法

このQ&Aのポイント
  • DB2+eclipse2.1で開発する際、テーブルのデータ削除に条件を付け加えたい場合、SQL文中でSUBSTRを使用するとエラーが発生します。
  • エラーメッセージによると、互換引き数を持つタイプの名前「SUBSTR」の許可ルーチンが見つからないという内容です。
  • DB2でSUBSTRを使用することは可能ですが、関数名を正しく指定する必要があります。指定方法については、以下の解決方法をご参照ください。
回答を見る
  • ベストアンサー

DELETE文のWHERE条件にSUBSTRを使いたい <DB2+Java1.4>

DB2+eclipse2.1で開発しています。 テーブルのデータ削除に条件を付け加えたいのですが、 strSql = "DELETE FROM スキーマ名.テーブル名 WHERE substr(ABC,1,6) < " + "200404"; というように、SQL文を書くと、 ------------------------------------ [IBM][CLI Driver][DB2/NT] SQL0440N 互換引き数を持つタイプ "FUNCTION" の名前 "SUBSTR" の許可ルーチンが見つかりませんでした。 SQLSTATE=42884 ------------------------------------ 上記エラーが出ます。 DB2でSUBSTRって使えると思うのですが。 ご存知の方いましたら、教えてください。 よろしくお願いします。

  • aw11
  • お礼率68% (30/44)

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

  • ベストアンサー
  • stosh666
  • ベストアンサー率40% (17/42)
回答No.1

SUBSTRで使っているABCは、カラムでしょうか?質問中のステートメントを見る限りそうだと思われますが、もし文字列定数だったらシングルクォーテーションが必要ですね。 DB2がどうかはあまり使った事がないので自信がないのですが、大抵のRDBMSは構文解析中に遭遇した解析不可能な点につき、人間の観点からすると相応しくないのではというようなエラーを返すので、100%信用しない方がいいかもしれません。

aw11
質問者

お礼

すみません。解決しました。 ABCはカラムで書いたんですけど、CHAR型じゃなかったです…NUMERIC型でした… 当然SUBSTRは使えるみたいですが、NUMERIC型には適応できなくて当たり前ですね。 解答ありがとうございました。

関連するQ&A

  • SQL 条件付きDELETE文について

    SQLを見よう見まねでいじることになりました。。 AテーブルからBテーブルの以下の条件が当てはまるデータを削除する SQLを作りたいと考えています。  (1)Bテーブルの『DAT_FLG』が1  (2)A.テーブル『KNR_NO』 と Bテーブル『KNR_NO』が同じ  (3)Aテーブル『STR_YMD』 と Bテーブル『STR_YMD』が同じ  (4)Aテーブル『END_YMD』 と Bテーブル『END_YMD』が同じ 以下のようなSQLを考えましたがエラーとなってしまいました。 DELETE FROM A JOIN B ON A.KNR_NO = B.KNR_NO and A.STR_YMD = B.STR_YMD and A.END_YMD = B.END_YMD B.DAT_FLG = '1' DBはoracleを使っています。 どなたか教えてください。

  • DB2で SQL1032N start database managerエラー

    はじめまして。初めて書き込みさせていただきます。 WebSphereでDB2をデータベースとして行っているのですけど、今日起動してDB2にconnectしようと思ったら COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] SQL1032N start database manager コマンドが発行されていません。 SQLSTATE=57019 というエラーメッセージが出てきてconnectできなくなってしまいました。どなたか改善方法知っている方いらっしゃいましたら教えてください。よろしくお願いします。

  • 【Excel VBA】DBがOracleの場合のSQL文

    SQL文で日付で条件をする場合について。 以前、DBがSQLサーバーの場合の指定方法を教えていただきましたが、 Oracleの場合はどうすればよいでしょうか? その時のURL:http://okwave.jp/qa3471834.html (過去の質問から引用) >SQL Server なら >strSql = strSql & " AND 日付 >= '" & dateTarget_s & "'" ※『日付』はテーブルのカラム名で日付型、  『dateTarget_s』も日付型です Oracleの場合は、#を使用でしょうか? (組み合わせ方が解らず) すみませんが、よろしくお願いします。

  • DB2の接続エラー

    はじめまして。 現在、Tivoli(MAXIMO)で使用しているDB2を自分のクライアント端末からDB2に接続し、VBで帳票を作ろうとしています。 しかし、DB2へ接続しようとすると、エラーとなります。 エラー内容は。 実行時エラー'2147217887(80040e21) CLI0124E 引き数の値が無効です。SQLSTATE=HY009となります。 DB2のランタイムクライアントをインストールしているので、ODBCには問題がないと思います。 接続のところで、エラーとなるようです。 コーディングは以下のようにしております。 strSQL = "select * From TICKET" ' 接続 cn.Open "Provider=IBMDADB2;DSN=MAXIMO.TICKET;UserID=user名;Password=password;" Set rs = cn.Execute(strSQL) DB2のバージョンは9 以上、よろしくお願いいたします。

  • EclipseでMySQLにDELETE文を二つまとめて送れない

    環境 WindowsXP Eclipse3.4 MySQL5.1 Server str="DELETE FROM table1 where id=28;DELETE FROM table2 where id=28";という文を実行したのですが 動作しなくて困っています。分かる方がいましたら教えてください。 よろしくお願いします。 st.executeUpdate(str);を利用し、DELETE文ひとつの場合は実行できました。 MySQLServerに直接入力しても実行できました。 しかしEclipseから読み込んで実行すると com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 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 'DELETE FROM table2 where id=28' at line 1 というエラーがでてわかりません。 分かる方がいましたらよろしくお願いします。

    • ベストアンサー
    • Java
  • db2のデータベース作成エラーについて

    はじめまして。 以前、以下のような質問がされていると思います。 「WebSphereでDB2をデータベースとして行っているのですけど、今日起動してDB2にconnectしようと思ったら COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] SQL1032N start database manager コマンドが発行されていません。 SQLSTATE=57019 というエラーメッセージが出てきてconnectできなくなってしまいました。どなたか改善方法知っている方いらっしゃいましたら教えてください。よろしくお願いします。」 その原因が「原因はユーザーのpassを変更した際、DB2のユーザーを変えなかったのが原因でした。」ということなのですが、現在同じエラーが出て困っています。どのような対処をすればよいか教えていただけないでしょうか。よろしくお願いいます。

  • AccessSQL COUNT文で該当レコード抽出したい

    初心者です。 Access2000であるテーブルの条件に一致した レコード件数を抽出するSQLを作成しました。 条件に該当しない場合も1件で件数が戻ってきてしまいます。 AccessクエリでSQLを貼り付けて 検証した場合はちゃんと0件になるのですが VBAのコードではうまく件数が抽出されません。 簡単なことだったらごめんなさい。 いろいろなサイトで探した末、 どうしても解決できないので ご教授よろしくお願いします。 Dim strSQL As String Dim db As DAO.Database Dim rs As DAO.Recordset  Dim IntCount As integer 'SQL文を生成 strSQL = "SELECT COUNT(*) AS 件数 FROM テーブル名 " strSQL = strSQL & "WHERE テーブル名.コード = '" strSQL = strSQL & Forms![フォーム名]![txtコード] strSQL = strSQL & "' AND Left([テーブル名]![区分],1) = '" strSQL = strSQL & Forms![フォーム名]![cnb種類].Column(0) strSQL = strSQL & "' AND テーブル名.名称 = '" strSQL = strSQL & Forms![フォーム名]![txt名称] strSQL = strSQL & "';" Set db = CurrentDb Set rs = db.OpenRecordset(strSQL, dbOpenDynaset) IntCount =  rs.RecordCount rs.Close Set db = Nothing Set rs = Nothing

  • 条件によって、Where分のキーを変更させたい

    ACCESS97を使用しています。SQL文の中で、変数?を使用したいのですが、 その扱いがわかりません。 例) 下記のようなテーブルがあります。 項目(1) 項目(2) 項目(3) 項目(4) 項目(5) 1 A 100 EE RR 2 B 200 EE RR 3 A 100 EE RR 4 A 100 CC EE 5 B 300 RR EE 6 A 100 RR EE 7 B 200 CC RR フォーム上で、項目(2)を入力します。(入力_1) また、もう1つ、データを入力します。(入力_2、EE,CC,RR) 項目(2)の値によって、 Aの時、項目(4) Bの時、項目(5)をみにいくようにしたいのです。 例えば、入力_1=A、入力_2=EEの時、 合計値200 (項目(1)は、1,3)     入力_1=B、入力_2=EEの時、 合計値300 (項目(1)は、5) この時、下記のようなロジックを組んでみたのですが パラメーターが少なすぎます と出てきます。  (SELECT対象は、一旦 * にしています) Dim KEY As String If (ME.入力_1 = "A") Then  '条件は別入力です。 KEY = "項目(4)" Else KEY = "項目(5)" End If Set RS = Nothing Set DB = Nothing Set DB = CurrentDb() strSQL = "SELECT * FROM テーブル WHERE " strSQL = strSQL + "KEY='" & Me.入力_2 & ";" strSQL = strSQL + "AND 項目(2)='" & Me.入力_1 & "'" Set RS = DB.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly) KEY をどのようにすればいいのかがわかりません。 宜しくお願いします。

  • SQLserver2008でのSQL発行時ののオブジェクトエラーについ

    SQLserver2008でのSQL発行時ののオブジェクトエラーについて 「sa」ユーザーでDB作成後テーブルも複数作成。そのあとにこのSQLを「SELECT * FROM (テーブル名)」で発行すると、赤線が出てきてオブジェクト(テーブル名)が無効です。」とのエラーメッセージが出てきます。けれども結果は正しく表示されます。 何がいけないのでしょうか? 「DB名」.「dbo」.「テーブル名」でも同じです・・・ スキーマ関係があまり詳しくないので是非教えてください。

  • Yes/Noフラグの値をコピーできない

    すいません。ACCESS2003 VBAで下記の問題で困っています。 新たに作成したmdbファイル(テーブルの中身は空)に既存のmdbファイルのテーブル内容をコピーしたいのですが、Yes/Noフラグ型だけ移行できません。一応サンプルのソースです↓ Dim db As DAO.Database Dim RS As DAO.Recordset Dim strsql As String コピー元のmdbファイルをオープン Set db = OpenDatabase("コピー元mdb") 'SQLの生成 strsql = "" strsql = strsql & " SELECT * FROM テーブル名" 'レコードセット生成 Set RS = db.OpenRecordset(strsql, dbOpenSnapshot, dbReadOnly) 'コピー元テーブルにデータがあるか判定 If RS.RecordCount = 0 Then msgbox "データがありません" Else RS.MoveFirst 'コピー先のデータベースを設定 Set db = OpenDatabase("コピー先mdb") 'レコードの初期化 db.Execute (DELETE FROM コピー先テーブル名) Do While RS.EOF = False strsql = "" strsql = strsql & " INSERT INTO コピー先テーブル名(" strsql = strsql & " ,コピー先のYes/Noフラグ値" ' strsql = strsql & ")VALUES(" strsql = strsql & " ,'"コピー元のYes/Noフラグ値 "' " strsql = strsql & ")" db.Execute (strsql) RS.MoveNext Loop End If RS.Close db.Close