Avatar billede martinm Nybegynder
02. september 2003 - 12:44 Der er 13 kommentarer og
1 løsning

Stored procedures - resultset.

Hej,

Er det mulig at se, hvad en MSSQL stored procedure returenerer inden mit callable statement bliver udført.
Jeg skal bruge disse informationer til at generere et output XML skema for diverse stored procedures. Alle disse procedures returnerer et resultset - altså ingen return eller outputværdier.
Avatar billede arne_v Ekspert
02. september 2003 - 13:27 #1
Jeg kender ihvertfald en metode.

Kald sp_help stored procedure:

sp_help xxxxxx

hvor xxxxxx er din stored procedure.

Den returnerer et hav af information om din stored procedure.

Der er muligvis andre metoder.
Avatar billede martinm Nybegynder
02. september 2003 - 17:06 #2
Mener du f.eks. sådan her: CallableStatement cstmt = con.prepareCall("{ call sp_help database.dbo.XXX(?)"); ??
Avatar billede arne_v Ekspert
02. september 2003 - 17:13 #3
Jeg har aldrig prøvet det via JDBC.

Jeg ville have prøvet med:

CallableStatement cstmt = con.prepareCall("{ call sp_help ?");

først.

Jeg kan prøve i aften.
Avatar billede martinm Nybegynder
02. september 2003 - 17:19 #4
CallableStatement cstmt = con.prepareCall("{call sp_help}");

Giver infomationer omkring, hvad der er views, stored procedurer osv. Intet om, hvad et resultset fra en stored procedure indeholder.

Men før DBMS'et kan give sådanne oplysninger skal den vel ned og parse alt SQL igennem i en given SP.. Nærmest pseudo-eksekverer den.. Hmm...
Avatar billede arne_v Ekspert
02. september 2003 - 18:06 #5
så_help uden argument giver en oversigt.

sp_help xxxx giver detaljer om xxxx.
Avatar billede arne_v Ekspert
02. september 2003 - 18:06 #6
Da stored procedures jo er compilet så er SQL parset og gemt i kompakt form.
Avatar billede martinm Nybegynder
02. september 2003 - 18:42 #7
Hvis jeg prøver med
CallableStatement cstmt = con.prepareCall("{call sp_help Northwind.dbo.Ten(?)}");
med eller uden ? og/eller (). Kaster den en SQLException: Could not locate entry in sysdatabases for database.
Avatar billede arne_v Ekspert
02. september 2003 - 18:58 #8
Her er et eksempel (stadigvæk Sybase men ude tvivl det samme i MS SQLServer):

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class UseSP2 {
    public static void main(String[] args) throws Exception {
        Class.forName("com.sybase.jdbc2.jdbc.SybDriver");
        Connection con = DriverManager.getConnection("jdbc:sybase:Tds:arnepc2:5000", "sa", "");
        con.setCatalog("Test");
        CallableStatement cstmt = con.prepareCall("{call sp_help(?)}");
        cstmt.setString(1, "TEST_MULTIOUT");
        cstmt.execute();
        ResultSet rs;
        if(cstmt.getMoreResults()) {
            rs = cstmt.getResultSet();
        }
        if(cstmt.getMoreResults()) {
            rs = cstmt.getResultSet();
        }
        if(cstmt.getMoreResults()) {
            rs = cstmt.getResultSet();
            while(rs.next()) {
              System.out.println(rs.getString(1) + " " + rs.getString(2));
            }
        }
        cstmt.close();
        con.close();
    }
}

Det udskriver argumenter med navn og type.
Avatar billede arne_v Ekspert
02. september 2003 - 18:59 #9
Hm.

Men nu læser jeg jo hvad du skriver.

Du vil have SP'ens ResultSet typer.

Det kan du ikke få uden at lave et kald.

Fordi hvilke ResultSet den returnerer kan afhænge af argumenterne.
Avatar billede arne_v Ekspert
02. september 2003 - 19:00 #10
Det eneste du kan gøre er at lave et kald ofg så kalde
rs.getMetaData og studere den information nærmere.

Beklager at jeg misforstod problemet.
Avatar billede martinm Nybegynder
02. september 2003 - 19:04 #11
Resultset's metadata og databasemetadata kan ikke løse mit problem, desværre.
Det skal bruges ifbm. en dbms-adapter til wli, der kan kalde stored procedures, der kan returnerer resultsets. Det kræver et output-xml-skema(bl.a. indeholdende de kolonner, som resultsettet indeholder).. Men det kan åbenbart ikke genereres på manglende information...Øv..
Avatar billede arne_v Ekspert
02. september 2003 - 19:29 #12
Skal du bruge stored procedures ?

Views vil jo være nemme at hente info for.
Avatar billede martinm Nybegynder
02. september 2003 - 19:31 #13
Ja, det kunne måske være løsningen.. Vil lige prøve ad - vender tilbage senere!
Avatar billede martinm Nybegynder
03. september 2003 - 09:46 #14
Fint. Det skulle bringe mig sikkert i mål!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester