Avatar billede madiedk Nybegynder
17. februar 2010 - 20:34 Der er 11 kommentarer og
1 løsning

stored procedures uden pl/sql

Hey

Jeg har en række sql sætningen (select, delete, insert) som skal kører på en oracle database. Er det muligt at lægge dem ind som stored procedures uden at skrive dem som pl/sql eller understøtter oracle ikke stored procedures der KUN består af sql?
Avatar billede arne_v Ekspert
17. februar 2010 - 20:40 #1
kan du bruge:

CREATE OR REPLACE PROCEDURE mange() AS
BEGIN
  SELECT ...;
  DELETE ...;
  INSERT ...;
END;

?
Avatar billede madiedk Nybegynder
17. februar 2010 - 20:43 #2
Men så er det stadig en stored procedure!?, og hvis en select så returnere mere end én række så skal man have en cursor og så er det ikke helt så simpelt mere.
Avatar billede arne_v Ekspert
17. februar 2010 - 20:50 #3
Ja. Du kan ikke lave en SP uden at lave en SP.

Er det reele problem den cursor?

Ville du vaere bedre stillet med en table func?
Avatar billede madiedk Nybegynder
17. februar 2010 - 21:18 #4
Jeg må indrømme at jeg ingen erfaring har med pl/sql og oracle stored procedure (kun kun læst meget lidt). Min situation er at jeg har en access database med en masse "stored procedured" (som kun består at sql) alt det skal nu ligges over på en oracle database, så ville vide om der var en mulighed for at jeg kan "nøjes" med kun at skrive sql i en stored procedure i oracle eller om det SKAL være i oracles pl/sql. Altså om jeg er tvunget til at lære pl/sql eller om der en en genvej eller commande der gør det lidt lettere. Håber det er forståligt
Avatar billede arne_v Ekspert
17. februar 2010 - 21:52 #5
For at lave simple SP'ere med lidt simple SQL saetninger i behover du ikke laere meget PL/SQL.

Er problem stillingen at du skal have konverteret dine Access queries paa en saadan maade saa du skal rette mindt muligt i applikationen?
Avatar billede madiedk Nybegynder
17. februar 2010 - 22:04 #6
Applikation skal også skrives om fra vba til java.

Problemet er at jeg gerne vil undgå at skulle bruge tid på at lærer pl/sql. Det er dog ikke simple sql forespørgsler, de er relativ store og komplekse nogle af dem.

Der er dog 2 krav jeg skal overholde:

1. mine stored procedures må ikke skrives i java

2. når der skal skrives til tabellerne skal det gøres via en stored procedure. (Så de forespørgsler hvor jeg kun skal trække ud, kan jeg godt putte direkte ind i java koden, men vil nu helst have det som en stored procedure)

Så hvordan gør jeg min situation lettest
Avatar billede arne_v Ekspert
17. februar 2010 - 22:19 #7
Jeg ville bare lave dem lige ud af landevejen.

1 Access query -> 1 Oracle SP

returner en cursor for select som returner flere raekker

Nem at tilgaa fra Java.

Stoerste problem er hvis der er noget Access specifik SQL som skal omskrives til Oracle specifik SQL.
Avatar billede madiedk Nybegynder
17. februar 2010 - 23:24 #8
okay tak, lyder som sådan også nemt nok.
Min bekymring er at man kan købe bøger på 800 sider om pl/sql, så det virker somom der umiddelbart er mange aspekter idet.

Da det jeg skal lave skal fungere i et miljø med vigtige data, kan jeg godt frygt at jeg overser noget hvis jeg bare laven en konvertering ved at google pl/sql og prøve mig frem.

Hvis jeg har en forespørgsel der f.eks. hedder:

Select navn, alder from person where alder > 18

hvordan ville hele commandoen se ud som der skulle skriver i sql+ for at oprette den procedurer? og er det noget jeg skal være opmærksom på generelt, hvis det kan siges her uden at være for omfattende?
Avatar billede arne_v Ekspert
18. februar 2010 - 02:21 #9
SP:

CREATE OR REPLACE PACKAGE refcurpkg IS
  TYPE refcur_t IS REF CURSOR;
END refcurpkg;
/
CREATE OR REPLACE PROCEDURE getsome(i_f1 IN INTEGER, o_rs OUT refcurpkg.refcur_t) AS
BEGIN
    OPEN o_rs FOR
    SELECT f1,f2
    FROM t1
    WHERE f1 > i_f1;
END;
/
Avatar billede arne_v Ekspert
18. februar 2010 - 02:22 #10
Java kode:

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

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

public class OraSP {
    public static void main(String[] args) throws Exception {
        Class.forName("oracle.jdbc.OracleDriver");
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:arnepc3", "xxxx", "xxxx");
        CallableStatement cstmt = con.prepareCall("BEGIN getsome(?,?); END;");
        cstmt.setInt(1, 2);
        cstmt.registerOutParameter(2, OracleTypes.CURSOR);
        cstmt.execute();
        //ResultSet rs = (ResultSet)cstmt.getObject(2);
        ResultSet rs = ((OracleCallableStatement)cstmt).getCursor(2);
        while(rs.next()) {
            int f1 = rs.getInt(1);
            String f2 = rs.getString(2);
            System.out.println(f1 + " " + f2);
        }
        rs.close();
        cstmt.close();
        con.close();
    }
}
Avatar billede madiedk Nybegynder
18. februar 2010 - 15:46 #11
tak, fandt lignende eksempel, men tak for bekræftelsen og tiden. smid et svar
Avatar billede arne_v Ekspert
18. februar 2010 - 16:06 #12
svar
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
Computerworld tilbyder specialiserede kurser i database-management

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