Avatar billede ttopholm Nybegynder
12. december 2005 - 20:03 Der er 36 kommentarer og
2 løsninger

Prepared statements vs Stored procedures vs statements

Er der nogen der ved hvor jeg kan finde en sammenligning mellem disse 3 kald.

Eller nogen der kan tilknytte et par kommentare til dem.
Avatar billede arne_v Ekspert
12. december 2005 - 20:13 #1
Vi snakker Java ikke ?

Jeg forklarer en del om PreparedStatement versus Statement her:
  http://www.eksperten.dk/artikler/830
Avatar billede arne_v Ekspert
12. december 2005 - 20:17 #2
stored procedures er "programming i SQL på database serveren"

det kan give nogle pæne performance forbedringer

det kan også bruges til at forbedre security

stored procedures er traditionelt ikke så populære i Java kredse, fordi
de ikke er portable mellem forskellige database
Avatar billede ttopholm Nybegynder
12. december 2005 - 20:17 #3
Nu var det bare generelt.. men jeg falder kun over det i java hvorfor egentlig det.. hvorfor ikke i php, asp el. lign.

Og synes ikke jeg finde så meget om med hensyn til hastigheder og således.. men tjekker lige din artikel....
Avatar billede arne_v Ekspert
12. december 2005 - 20:22 #4
(jeg har nogle eksempler på Java & SP)
Avatar billede arne_v Ekspert
12. december 2005 - 20:23 #5
Statement findes vel i alle database API'er

PreparedStatement eksisterer i de fleste database API'er

i JDBC (og PHP 5.x MySQL API) hedder det PreparedStatement

i ADO og ADO.NET hedder det Parameters
Avatar billede ttopholm Nybegynder
12. december 2005 - 20:23 #6
hvad mener du med:
Statement ikke genbrugt
statement genbrugt
PreparedStatement ikke genbrugt
PreparedStatement genbrugt
Avatar billede dsj Nybegynder
12. december 2005 - 20:23 #7
Statements er så at sige rå SQL-udtryk, ét statement kan kun indeholde ét samlet SQL-udtryk.

Prepared statements er har til formål at optimere gentagelser af det samme statement, men med forskellige data, f.eks. 4000 inserts kan med fordel afvikles som prepared statement. De fungerer sådan, at udtrykket forberedes/behandles på database-serveren, hvor værdier angives med spørgsmålstegn. Data indsættes fra applikationen for hvert spørgsmålstegn, hvorefter det samlede SQL-udtryk eksekveres. Herefter kan applikationen indsætte nye data og eksekvere SQL-udtrykket uden at skulle sende selve SQL-udtrykket med, men kan nøjes med værdierne.

Stored procedures gør det muligt at afvikle mange statements i én samlet operation direkte i database-serveren. Samtidig er det muligt at bruge T-SQL, der gør programmelle udtryk mulige, såsom if/else, for/while mv.
Avatar billede ttopholm Nybegynder
12. december 2005 - 20:25 #8
Så når vi har med mssql at gøre det hedder parameters... måske derfor jeg ikke kunne finde noget på det...
Avatar billede arne_v Ekspert
12. december 2005 - 20:28 #9
kig på koden

det er spørgsmålet om hvorvidt man opretter et nyt Statement eller PreparedStatement
objekt for hvert SQL kald
Avatar billede arne_v Ekspert
12. december 2005 - 20:35 #10
nej termen er database API afhængigt ikke database afhængigt

du kan godt bruge JDBC PreparedStatement mod SQLServer og
ADO.NET Parameters mod Oracle
Avatar billede ttopholm Nybegynder
12. december 2005 - 20:41 #11
ved du hvordan du definere prepared statements i asp så...

Og hvor meget mere giver stored procedures contra prepared statements...
Avatar billede ttopholm Nybegynder
12. december 2005 - 20:47 #12
Måske sådan her:

set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open = "Driver={SQL Server}; Server=localhost; Database=test; uid=xxx; pwd=xxx;timeout=500;Connection_timeout=500;"

Conn.Execute("PREPARE test FROM "SELECT name FROM tabel WHERE ID = ?")
Eller sådan her:
Conn.Execute("PARAMETERS test FROM "SELECT name FROM tabel WHERE ID = ?")
Avatar billede ttopholm Nybegynder
12. december 2005 - 20:47 #13
Det er jeg lidt i tvivl om...
Avatar billede arne_v Ekspert
12. december 2005 - 20:50 #14
<%
' open
adParamInput = 1
adInteger = 3
adVarChar = 200
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
' traditionel
con.Execute "INSERT INTO t1 VALUES(7,'O''Toole')"
' med parameters
cmd.CommandText = "INSERT INTO t1 VALUES(@f1,@f2)"
cmd.Parameters.Append(cmd.CreateParameter("@f1", adInteger, adParamInput))
cmd.Parameters.Append(cmd.CreateParameter("@f2", adVarChar, adParamInput, 50))
cmd.Parameters("@f1") = 8
cmd.Parameters("@f2") = "O'Malley"
cmd.Execute
' close
Set cmd = Nothing
Set con = Nothing
%>
OK
Avatar billede arne_v Ekspert
12. december 2005 - 21:00 #15
eksemplet er mod Access, men det er helt det samme med SQLServer
Avatar billede arne_v Ekspert
12. december 2005 - 21:10 #16
stored procedures vil i nogle tilfælde - formentligt mest i forbindelse med
SQL sætninger som kun skal udføres en gang per connetcion og som ikke
er specielt tunge give noget fordi den gemmer execution plan - i andre tilfælde vil
der ikke være den store forskel
Avatar billede ttopholm Nybegynder
19. december 2005 - 02:12 #17
smid et svar begge to
Avatar billede dsj Nybegynder
19. december 2005 - 09:08 #18
Svar.
Avatar billede arne_v Ekspert
19. december 2005 - 10:10 #19
ok
Avatar billede ttopholm Nybegynder
01. januar 2006 - 23:03 #20
Hej Arne_v, er det den eneste måde, som du skrev den 12/12 kl. 20.50.06, men kan lave en prepared statement i asp
Avatar billede ttopholm Nybegynder
01. januar 2006 - 23:04 #21
Og den her linie:
cmd.Parameters.Append(cmd.CreateParameter("@f2", adVarChar, adParamInput, 50))
adParamInput er det mindste input og de 50 er max input eller hvad...
Avatar billede arne_v Ekspert
01. januar 2006 - 23:09 #22
tror jeg

----

adParamInput betyder at det er en input parameter (stored procedures kan også
havde output parameter)

50 er max længde altså en VARCHAR(50)
Avatar billede ttopholm Nybegynder
01. januar 2006 - 23:13 #23
Du mener prepared statements ik....

hvorfor definere du adVarChar til 200, når du definere den til 50 senere ;-)
Avatar billede arne_v Ekspert
01. januar 2006 - 23:16 #24
nej

parameters deles af prepared statements og stored procedures

det er altid adParamInput for prepared statements, men stored procedures kan bruge
adParamOutput
Avatar billede arne_v Ekspert
01. januar 2006 - 23:17 #25
adVarChar = 200

er kode nummeret for VARCHAR - det har ikke noget med længde at gøre
Avatar billede ttopholm Nybegynder
01. januar 2006 - 23:19 #26
Men i Stored procedures kan man jo bare nøjes med at kalde den således her:

SQL = "INSERT_STATEMENT  'test'"
Conn.Execute(SQL)
Avatar billede ttopholm Nybegynder
01. januar 2006 - 23:20 #27
eller bruger du man også cmd.parameters der
Avatar billede arne_v Ekspert
01. januar 2006 - 23:24 #28
det er ret almindeligt at bruge parameters til stored procedures

og hvis man vil have en output parameter så er det absolut nødvendigt
Avatar billede arne_v Ekspert
01. januar 2006 - 23:26 #29
jeg har faktisk et eksempel

dog i JScript og ikke i VBScript men ADO er det samme

<%@ Language="JScript" %>
<%
var adCmdStoredProc = 4;
var adParamOutput = 2;
var adParamReturnValue = 4;
var adInteger = 3;
var con = Server.CreateObject("ADODB.Connection");
con.open("Provider=SQLOLEDB; Server=ARNEPC2;Database=Test;User ID=sa;Password=;");
var cmd = Server.CreateObject("ADODB.Command");
cmd.ActiveConnection = con;
cmd.CommandType = adCmdStoredProc;
cmd.CommandText = "TEST_OUTRET";
cmd.Parameters.Append(cmd.CreateParameter("@retval", adInteger, adParamReturnValue));
cmd.Parameters.Append(cmd.CreateParameter("@outarg", adInteger, adParamOutput));
cmd.Execute;
Response.Write(cmd.Parameters("@outarg").Value + " " + cmd.Parameters("@retval").Value);
con.Close;
%>
Avatar billede ttopholm Nybegynder
01. januar 2006 - 23:28 #30
Den her kan nu godt returnere et recordsæt uden at man angiver output parameter..

SQL = "SQL_STATEMENT  'test'"
Conn.Execute(SQL)

Hvor SQL_STATEMENT er en SELECT-sætning....
Avatar billede arne_v Ekspert
01. januar 2006 - 23:30 #31
ja

men det er noget andet

en stored procedure kan returnere værdier på 3 måder:

result set (som bliver til ADO record set)

output parameters (adParamOutput)

return værdier (adParamReturnValue)
Avatar billede arne_v Ekspert
01. januar 2006 - 23:30 #32
her er et eksempel på en som gør alle 3 ting:

CREATE PROCEDURE TEST_OUTRSRET
@outarg INTEGER OUTPUT
AS
SELECT @outarg = 123
SELECT * FROM T1
RETURN 456
GO
Avatar billede arne_v Ekspert
01. januar 2006 - 23:31 #33
SELECT @outarg = 123 -- brug output parameter
SELECT * FROM T1 -- bruge result/record set
RETURN 456 -- brug retur værdi
Avatar billede ttopholm Nybegynder
01. januar 2006 - 23:34 #34
Ahh... Nice......

Du er squ god til alt det her.. takker..... ;-)
Avatar billede ttopholm Nybegynder
02. januar 2006 - 12:14 #35
Hej arne_v

Når jeg kører den her:

adParamInput = 1
adInteger = 3
adVarChar = 200
Conn.Open ConnectionStr
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = Conn
cmd.Prepared=true
cmd.CommandText = "INSERT INTO tbl VALUES(@f1,@f2)"
cmd.Parameters.Append cmd.CreateParameter("@f1", adInteger, adParamInput)
cmd.Parameters.Append cmd.CreateParameter("@f2", adVarChar, adParamInput, 50)
cmd.Parameters("@f1") = 1
cmd.Parameters("@f2") = "test"
cmd.Execute

Får jeg denne fejl:
Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the variable '@f1'.
Avatar billede arne_v Ekspert
02. januar 2006 - 12:20 #36
hvordan ser din connetion string ud ?
Avatar billede ttopholm Nybegynder
02. januar 2006 - 12:20 #37
Har fixet den med den her:
adParamInput = 1
adInteger = 3
adVarChar = 200
Conn.Open ConnectionStr
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = Conn
cmd.Prepared=true
cmd.CommandText = "INSERT INTO tbl VALUES(?,?)"
cmd.Parameters.Append cmd.CreateParameter("One", adInteger, adParamInput)
cmd.Parameters.Append cmd.CreateParameter("Two", adVarChar, adParamInput, 50)
cmd.Parameters("One") = 1
cmd.Parameters("Two") = "test"
cmd.Execute
Avatar billede arne_v Ekspert
02. januar 2006 - 12:50 #38
hvis du brugte en OLE DB connection string fremfor en ODBC connection string
så tror jeg at den med @ virkede, men ODBC er lidt anderledes
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