Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 09:43 Der er 15 kommentarer

Problemer med at kalde stored procedure i oracle database

Jeg skal kalde en stored procedure, men jeg har lidt problemer hermed.
Hvis jeg kalder proceduren med forekert antal parametre får jeg følgende fejl:

ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'INSERT_AUTOMAT'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Hvilket altså indikerer at databasen har fundet proceduren men fundet ud af at der mangler parametre.
Hvis jeg så sender det korrekte antal parametre med kommer den med følgende fejlmeddelse:

ORA-06550: line 1, column 7:
PLS-00221: 'INSERT_AUTOMAT' is not a procedure or is undefined
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Hvilket absolut ikke giver mening da man nu får indtrykket at systemet slet ikke kender den procedure selvom det eneste jeg har gjort er at sende det korrekte antal parametre med.
Jeg er ret blank og håber på at få lidt hjælp.
Her er den kode jeg har skrevet :

                con=new Oracle.DataAccess.Client.OracleConnection("User Id=vegas_2;Password=vegas;Data Source=tekt;");
                con.Open();
                Oracle.DataAccess.Client.OracleCommand com=new Oracle.DataAccess.Client.OracleCommand("WWW_DB_ACCESS.INSERT_AUTOMAT",con);
                com.Parameters.Add("pAutSerNr",Oracle.DataAccess.Client.OracleDbType.Varchar2,"value",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pElektrNr",Oracle.DataAccess.Client.OracleDbType.Int32,"5",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pProgNr",Oracle.DataAccess.Client.OracleDbType.Int32,"5",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pKabNr",Oracle.DataAccess.Client.OracleDbType.Int32,"5",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pSTedNr",Oracle.DataAccess.Client.OracleDbType.Int32,"5",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pBemaerk",Oracle.DataAccess.Client.OracleDbType.Varchar2,"value",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pAutNavnNr",Oracle.DataAccess.Client.OracleDbType.Int32,"5",System.Data.ParameterDirection.Input);
                com.CommandType=System.Data.CommandType.StoredProcedure;
                com.ExecuteNonQuery();

Og definitionen på proceduren:

FUNCTION INSERT_AUTOMAT(
          pAutSerNr in varchar2,
          pElektrNr in Number,
          pProgNr in Number,
          pKabNr in Number,
          pSTedNr in Number,
          pBemaerk in varchar2,
          pAutNavnNr in number)
RETURN NUMBER ;-- returnerer aut_nr ellers negativ fejlkode
Avatar billede arne_v Ekspert
23. februar 2005 - 10:26 #1
Det er da en function og ikke en stored procedure !?
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:05 #2
Ja nemlig.
En function kan retunere en værdi. De kan vidst godt kaldes fra dotnet
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:05 #3
Så altså meningen er at oracle-funktionen skal modtage nogle parametre, arbejde med disse og så returnere en værdi
Avatar billede arne_v Ekspert
23. februar 2005 - 13:08 #4
Ja.

Men kan de med den syntax ?

Jeg ville umiddelbart have troet at man skulle:

SELECT INSERT_AUTOMAT(diverse argumenter)

som query.

Eller at det skulle laves om til en stored procedure som også returnerede
en værdi.

Jeg kan tage fejl - jeg har aldrig lavet en function i Oracle.
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:10 #5
Jo, du har med garanti ret i at man skal gøre det.
Nok derfor jeg har en fejl :)
Jeg prøver lige
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:12 #6
Okay, nu har jeg lavet følgende:

con=new Oracle.DataAccess.Client.OracleConnection("User Id=vegas_2;Password=vegas;Data Source=tekt;");
                con.Open();
               
                Oracle.DataAccess.Client.OracleCommand com=new Oracle.DataAccess.Client.OracleCommand(
                    ":res := WWW_DB_ACCESS.INSERT_AUTOMAT("+
                    "pAutSerNr => :pAutSerNr,"+
                    "pElektrNr => :pElektrNr,"+
                    "pProgNr => :pProgNr,"+
                    "pKabNr => :pKabNr,"+
                    "pSTedNr => :pSTedNr,"+
                    "pBemaerk => :pBemaerk,"+
                    "pAutNavnNr => :pAutNavnNr"+
                    ")",con);
                com.Parameters.Add("res",Oracle.DataAccess.Client.OracleDbType.Int32,System.Data.ParameterDirection.Output);
                com.Parameters.Add("pAutSerNr",Oracle.DataAccess.Client.OracleDbType.Varchar2,"vaerdi",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pElektrNr",Oracle.DataAccess.Client.OracleDbType.Int32,5,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pProgNr",Oracle.DataAccess.Client.OracleDbType.Int32,5,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pKabNr",Oracle.DataAccess.Client.OracleDbType.Int32,5,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pSTedNr",Oracle.DataAccess.Client.OracleDbType.Int32,5,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pBemaerk",Oracle.DataAccess.Client.OracleDbType.Varchar2,"vaerdi",System.Data.ParameterDirection.Input);
                com.Parameters.Add("pAutNavnNr",Oracle.DataAccess.Client.OracleDbType.Int32,5,System.Data.ParameterDirection.Input);
                com.CommandType=System.Data.CommandType.StoredProcedure;
                com.ExecuteNonQuery();
                richTextBox1.Text="Resulatat:["+com.Parameters["res"]+"]";


Og får fejlen:
ORA-01008: not all variables bound

Hvad gør jeg galt?
Avatar billede arne_v Ekspert
23. februar 2005 - 13:16 #7
Mangler du ikke 8 stk.:

com.Parameters("xxxx").Value = noget;
Avatar billede arne_v Ekspert
23. februar 2005 - 13:16 #8
7 stk. - res er jo out
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:17 #9
Jamen det ligger jo i selve add metoden
com.Parameters.Add("pSTedNr",Oracle.DataAccess.Client.OracleDbType.Int32,5,System.Data.ParameterDirection.Input);

Her er værdien 5
Avatar billede arne_v Ekspert
23. februar 2005 - 13:17 #10
Og naturligvis:

com.Parameters["xxxx"].Value = noget;
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:22 #11
Følgende kode giver samme resultat (Altså samme fejl: "not all variables bound")


                Oracle.DataAccess.Client.OracleCommand com=new Oracle.DataAccess.Client.OracleCommand(
                    ":res := WWW_DB_ACCESS.INSERT_AUTOMAT("+
                    "pAutSerNr => :pAutSerNr,"+
                    "pElektrNr => :pElektrNr,"+
                    "pProgNr => :pProgNr,"+
                    "pKabNr => :pKabNr,"+
                    "pSTedNr => :pSTedNr,"+
                    "pBemaerk => :pBemaerk,"+
                    "pAutNavnNr => :pAutNavnNr"+
                    ")",con);
                com.Parameters.Add("res",Oracle.DataAccess.Client.OracleDbType.Int32,System.Data.ParameterDirection.Output);
                com.Parameters.Add("pAutSerNr",Oracle.DataAccess.Client.OracleDbType.Varchar2,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pElektrNr",Oracle.DataAccess.Client.OracleDbType.Int32,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pProgNr",Oracle.DataAccess.Client.OracleDbType.Int32,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pKabNr",Oracle.DataAccess.Client.OracleDbType.Int32,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pSTedNr",Oracle.DataAccess.Client.OracleDbType.Int32,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pBemaerk",Oracle.DataAccess.Client.OracleDbType.Varchar2,System.Data.ParameterDirection.Input);
                com.Parameters.Add("pAutNavnNr",Oracle.DataAccess.Client.OracleDbType.Int32,System.Data.ParameterDirection.Input);
               
               
                com.Parameters["pAutSerNr"].Value="1234567894387548";
                com.Parameters["pElektrNr"].Value=10;
                com.Parameters["pProgNr"].Value=10;
                com.Parameters["pKabNr"].Value=10;
                com.Parameters["pSTedNr"].Value=10;
                com.Parameters["pBemaerk"].Value="lkjsdfagkj";
                com.Parameters["pAutNavnNr"].Value=10;
                com.CommandType=System.Data.CommandType.StoredProcedure;
               
               
                com.ExecuteNonQuery();
                richTextBox1.Text="Resulatat:["+com.Parameters["res"]+"]";
Avatar billede arne_v Ekspert
23. februar 2005 - 13:30 #12
Sorry - jeg havde ikke lige bemærket at der var værdier i Add.

Jeg bruger altid selv Add af selve parameter og så sæt Value senere.
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:32 #13
Ja okay, ingen problem :)

Har du andre ideer til hvad jeg gør galt arne?
Jeg er virkelig helt blank....og jeg skal nemlig have det her færdigt snart :/
Avatar billede arne_v Ekspert
23. februar 2005 - 13:34 #14
Ikke lige umiddelbart. Jeg prøver at tænke.
Avatar billede forceprogrammer Nybegynder
23. februar 2005 - 13:38 #15
Okay. Tak skal du have.
Jeg prøver også at lede videre på google efter eksempler.
De er ikke just mangfoldige.
Jeg værdsætter din hjælp.
Mvh. Forceprogrammer
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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