2011-01-18 19 views
5

Wykonuję procedurę składowaną za pomocą standardowego połączenia JDBC przy użyciu sterownika MS SQL w wersji 3.0.Tabele tymczasowe przy użyciu JDBC z wartością zerową ResultSet

Znalazłem, że podczas tworzenia i wstawiania danych do tabeli tymczasowej procedura przechowywana nie wykonuje się poprawnie.

Kod Java nie rzuci wyjątku, ale javax.sql.ResultSet będzie .

punktu awarii w procedurze przechowywanej jest kiedy un-skomentować INSERT INTO #TBL CLM_NAME VALUES('VAL')

Kiedy wykonać instrukcję SQL przy użyciu Studio Menedżer to wykonuje bez kłopotów i danych zgodnie z oczekiwaniami.

Czy ktoś się z tym zetknął lub wie, dlaczego tak się dzieje?

Początkowo myślałem, że jego ponieważ kierowcy SQL i nadal uważam, że jest?

Dzięki.

+0

Czy możesz upewnić się, że tworzysz i ładujesz tabelę tymczasową i czytasz z niej wszystkie w tym samym połączeniu? – CoolBeans

+0

Tak, tabela tymczasowa jest tworzona z utworzonej procedury przechowywanej. Procedurę przechowywaną wywołuję tylko z kodu Java, na przykład connect.executeQuery ("{procName (?)}"). – Koekiebox

+1

Czy niepoprawna instrukcja 'INSERT' znajduje się w tej samej przechowywanej procedurze, która tworzy tabelę tymczasową? –

Odpowiedz

13

Może this will help:

zaleca się, jeśli chcesz korzystać z tabel tymczasowych, nie należy nazywać „prepareStatement”. Możesz bezpośrednio wykonać zapytanie z obiektu instrukcji.

Na przykład:

String sql = "select uuid, name from Component"; 

Statement stmt = dbCon.createStatement(); 
ResultSet rs = stmt.executeQuery(sql); 

Jeśli trzeba nazwać „prepareStatement”, a następnie trzeba będzie stworzyć prawdziwy stół i, jeśli to konieczne, usunąć tabelę później.

+0

Oczywiście, jeśli masz jakiekolwiek parametry, powinieneś użyć metody prepareStatement, a nie createStatement, lub powinieneś bardzo, bardzo ostrożnie podchodzić do wtrysku sql: http://stackoverflow.com/questions/1582161/how-does-a-preparedstatement- uniknij-lub-zapobiegaj-sql-iniekcjom –

2

Mam również do czynienia z tym samym problemem. Aby to naprawić, mam zamiar skonfigurować śledzenie na moim serwerze sql i zobaczyć wszystkie instrukcje, które są wykonywane przez sterownik MS JDBC przed wykonaniem faktycznego wywołania SP. To powinno mi pomóc wyjaśnić sprawę. Niestety nasz DBA jest już dostępny, więc będę musiał to zrobić jutro z jej pomocą. Dam ci znać, co się dzieje i jaka jest poprawka.

+0

Poddałem się i użyłem sub zapytania zamiast tablic tymczasowych lub zmiennych tabel. –

6

Polecenie executeQuery() jest przeznaczone do użycia z zapytaniami, które zwracają ResultSet, zazwyczaj instrukcje SELECT.

Metoda executeUpdate() jest przeznaczona do instrukcji INSERT, UPDATE, DELETE lub DDL, które zwracają liczbę aktualizacji.

Oba powyższe elementy (ResultSets i aktualizacje) są uznawane przez JDBC za "wyniki". W przypadku zapytań, które zwracają wiele wyników, wymagamy wywołania execute().

Jeśli procedura składowana korzysta z tabel tymczasowych, prawdopodobnie najpierw zwraca liczbę aktualizacji, a następnie zestaw wyników. Powinieneś użyć polecenia execute(), aby uruchomić kwerendę, wywołać getMoreResults(), aby pominąć licznik aktualizacji, a następnie wywołać getResultSet(), aby uzyskać ResultSet, który chcesz uzyskać. Problem polega na tym, że musimy wykonać próbę i błąd, wywołując funkcję getMoreResults() wiele razy, aby pobrać zestaw wyników, który chcemy, wywołując metodę getResultSet().

Zamiast powyższego sposobu prób i błędów można pominąć wszystkie dodatkowe "wyniki zapytania", określając "USTAW NOCNOUNT NA".

Zmiany wymagane

  1. Wskaż swoją logikę w SP "SPCHILD". Ta procedura zapisana będzie mieć logikę wraz z tworzeniem tabeli tymczasowej.

  2. Tworzenie SP "SPPARENT" jak poniżej,

    CREATE PROCEDURE [dbo].[SPPARENT] @Id int = NULL 
    AS 
    BEGIN 
    SET NOCOUNT ON; 
    EXEC(' SPCHILD @Id = ' + @Id) 
    END 
    

    nadrzędnego SP "SPPARENT" trzeba połączyć się z rzeczywistą SP czyli "SPCHILD".

  3. Z kodu JDBC wywołaj SP na "SPPARENT".

+0

Świetna odpowiedź! Działa również z tabelami tabeli deklaracji deklaracji. –

+0

Świetna odpowiedź! kocham Cię! – Benyamin

Powiązane problemy