Dynamicznie generowana kwerenda z GROUP BY to_char(data, ?) - czy jest wykonalne ?

0

WItam;

Chcę stworzyc funkcje która dynamicznie generowałaby kwerendę typu:
String sql = "SELECT to_char(data, 'YYYY-MM'), sum(wartosc) FROM tabela GROUP BY to_char(data, 'YYYY-MM');

Tabela

data | date
wartosc | number

Pomyślałem zrobię to na PreparedStatement ...

String grupa = "YYYY-MM"; // zmienna ta przyjmuje wartości ("YYYY", "YYYY-MM", "YYYY-MM-DD")

PreparedStatement kwerenda (String grupa) {
...
String sql = "SELECT to_char(data, ?), sum(wartosc) FROM tabela GROUP BY to_char(data, ?);
prepState.toString(1, grupa);
prepState.toString(2, grupa);
...
}

..i to generuje mi kwerendę która jest błędna (czepia sie do group by). Jeżeli wpiszę kwerendę taką jak podałem na górze wszystko jest OK. Co jest grane ?

0

czy ty jesteś może upośledzony umysłowo?? Po c**** trzeci raz zakładasz ten sam temat jak i tak dostaniesz taką samą odpowiedź jak w poprzednich?

= NIE UŻYWAJ PARAMETRÓW TYLKO ZŁÓŻ ZAPYTANIE W STRINGU!! =

1

String sql = "SELECT to_char(data, '"+okres+"' ), SUM(wartosc) as suma FROM test WHERE data >= to_date( '"+start+"' ,'YYYY-MM-DD HH24:MI') and data <= to_date( '"+end+"' ,'YYYY-MM-DD HH24:MI') GROUP BY to_char(data, '"+okres+"' ) ORDER BY to_char(data, '"+okres+"' )";

... i to jest najbardziej profesjonalne dynamiczne tworzenie kwerendy w Javie ?! Fakt, to działa ... no comment

1

Wydaje mi się, że będziesz musiał mieć 3 zapytania (utworzone statycznie).
Oczywiście daty (start i end) powinno się podawać przez parametry, nie przez sklejanie napisów.

0

Misiekd po 1. nie bądź wulgarny, po 2. zapytań nie składa się ze stringów tylko właśnie używa się parametrów.

Majkel - podaj cały kawałek kodu, który odpowiada za to zapytanie.

1

Tak, parametrow uzywa sie ale w where i having, jesli chcesz parametryzowac wartosci. Inne kawalki zapytania nie sa parametryzowane, przynajmniej nie w standardzie JDBC. Misiek ma racje.

0

To co mówi ::. by się zgadzało bo robiłem testy z parametrem dla GROUP BY i wywalalo blad.

Podsylam calą funkcje PreparedSTatement moze ktos cos wymysli:

   public PreparedStatement querryBarChartAndLineChart(String okres, String start, String end) throws SQLException
    {
       Connection con = databaseAccess.getOracleDbConnection();
       String sql = "SELECT to_char(data, ? ), SUM(wartosc) as suma FROM test WHERE data >= to_date( ? ,'YYYY-MM-DD HH24:MI') and data <= to_date( ? ,'YYYY-MM-DD HH24:MI') GROUP BY to_char(data, ? )";
     
       PreparedStatement prepState = con.prepareStatement(sql);
       prepState.setString(1, okres);
       prepState.setString(2, start);
       prepState.setString(3, end);
       prepState.setString(4, okres);

    
       return prepState;
    } 

Próbowałem tez na NamedParameterStatement i tez bylo to samo:

public NamedParameterStatement querryBarChartAndLineChart(String okres, String start, String end) throws SQLException
    {
       Connection con = databaseAccess.getOracleDbConnection();
       String sql = "SELECT to_char(data,:okres), SUM(wartosc) as suma FROM test WHERE data >= to_date( :start ,'YYYY-MM-DD HH24:MI') and data <= to_date( :end ,'YYYY-MM-DD HH24:MI') GROUP BY to_char(data, :okres)";

       NamedParameterStatement prepState = new NamedParameterStatement(con,sql);
       prepState.setString("start", start);
       prepState.setString("okres", okres);
       prepState.setString("end", end);

       return prepState;
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1