web-dev-qa-db-ja.com

DB2 SQLエラー:SQLCODE = -204、SQLSTATE = 42704

DB2に「TestDB」というローカルデータベースを作成し、次に「TestTable」というテーブルを作成しました。
テーブルのスキーマ名は「yasmin」です。
JDBCを使用してDB2データベースに接続しようとしていますが、この例外が発生しました

    R SQLException information
[1/4/14 11:32:59:289 EST] 0000004d SystemErr     R Error msg: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.TESTTABLE, DRIVER=3.61.86
[1/4/14 11:32:59:290 EST] 0000004d SystemErr     R SQLSTATE: 42704
[1/4/14 11:32:59:290 EST] 0000004d SystemErr     R Error code: -204
[1/4/14 11:32:59:290 EST] 0000004d SystemErr     R com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.TESTTABLE, DRIVER=3.61.86

セットスキーマのようなインターネットで多くのソリューションを試しましたが、残念ながら機能しません。

これは私が使用したJDBCコードです

 String urlPrefix = "jdbc:db2:";
        String url;
        String user;
        String password;
        String empNo;                                                              
        Connection con;
        Statement stmt;
        ResultSet rs;

        url = urlPrefix + "//127.0.0.1:50000/TestDB";
        user = "db2admin";
        password = "db2admin";
        try 
        {                                                                        
          // Load the driver
          Class.forName("com.ibm.db2.jcc.DB2Driver");                              
          System.out.println("**** Loaded the JDBC driver");

          // Create the connection using the IBM Data Server Driver for JDBC and SQLJ
          con = DriverManager.getConnection (url, user, password);                 
          // Commit changes manually

          con.setAutoCommit(false);
          System.out.println("**** Created a JDBC connection to the data source");
          stmt = con.createStatement();   con.createStatement();                                         
          System.out.println("**** Created JDBC Statement object");
          // Execute a query and generate a ResultSet instance

          rs = stmt.executeQuery("select *from TestTable");                   
          System.out.println("**** Created JDBC ResultSet object");
        }

        catch (ClassNotFoundException e)
        {
          System.err.println("Could not load JDBC driver");
          System.out.println("Exception: " + e);
          e.printStackTrace();
        }

        catch(SQLException ex)                                                      
        {
          System.err.println("SQLException information");
          while(ex!=null) {
            System.err.println ("Error msg: " + ex.getMessage());
            System.err.println ("SQLSTATE: " + ex.getSQLState());
            System.err.println ("Error code: " + ex.getErrorCode());
            ex.printStackTrace();
            ex = ex.getNextException(); // For drivers that support chained exceptions
          }
        }
8
Yasmin

@Mark Rotteveelが言ったように、-204エラーはオブジェクトの欠落によるものですが、彼が言った以外の理由で欠落しています。

スキーマ名をプレフィックスとして付けていないため、見つかりません。あなたはそれがスキーマyasminにあると言ったが、db2adminで接続しているので、db2admin.TestTableを探している。

SELECT * FROM yasmin.TestTable

あなたが探しているものでなければなりません。

デフォルトでは、スキーマの検索パスは現在接続しているユーザーの名前です。あなたはそれが使用しているものを見ることができます

SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1

変更したい場合は、 SET SCHEMA コマンドを使用して検索パスを変更できますが、通常はスキーマ名をクエリに含める方が簡単です。

11
bhamby

エラー SQLERROR -204、SQLSTATE 42704 はオブジェクト名の欠落/不明であり、ほとんどの場合、スペースの欠落が原因です。

rs = stmt.executeQuery("select *from TestTable");

どちらにする必要があります:

rs = stmt.executeQuery("select * from TestTable");
3
Mark Rotteveel

問題は、db2で作成したテーブルのスキーマ名が"yasmin"
ユーザー名とパスワードを使用しました"db2admin/db2admin" JDBC接続で
このスキーマ「db2admin」でテーブルを検索します
そのため、スキーマを"yasmin"
そのため、接続を作成した後に次のコード行を追加しました

            String schemaName="yasmin";
            if (schemaName != null && schemaName.length() != 0) {

            try {
                statement = connection.createStatement();
                statement.executeUpdate("set current sqlid = " + schemaName);
                System.out.println("The schema is set successfully.");
            } catch (SQLException exception) {
                exception.printStackTrace();

            }

db2adminにdb2のこのテーブルのすべての特権を付与します

表を右クリックして特権を選択します
2-[ユーザーの追加]ボタンをクリックします
3-それからユーザー名「db2admin」を書き、「適用」ボタンをクリックします
4-次に、追加したばかりのユーザーを選択して、[すべてを削除]ボタンをクリックします

今、彼はテーブルを見ることができます。

@Mark Rotteveelと@bhambyに感謝します。

2
Yasmin

Hibernateを使用してSpringで接続している場合、プロパティ行で次を使用します

<property name="url" value="jdbc:db2://<ip>:<port>/<database>:currentSchema=<currentSchema>;" />
0
punkck

他の方法は、エイリアスを作成するだけです。これが好きです:

CREATE ALIAS USER1.YOURTABLE FOR TABLE USER2.YOURTABLE;
0
Thang Vinh Tran