Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Re: Executar Procedure VB6 x ORACLE

124 views
Skip to first unread message

Renato Tavares

unread,
Sep 23, 2004, 7:19:25 PM9/23/04
to
Pessoal
Bom Dia!

O que eu quero fazer é retornar no meu text9.text o valor
retornado pela minha procedure no ORACLE.
Vejam o Exemplo abaixo:


Procedure no ORACLE

CREATE OR REPLACE PROCEDURE "USINA"."TOTAL_HORAS_APO"
(PARAMETRO1 IN VARCHAR2,
PARAMETRO2 IN VARCHAR2 )
AS

TOTAL NUMBER;

BEGIN

SELECT SUM(B.QUANT) AS QUANT
INTO TOTAL
FROM FUNCIONARIOS A LEFT OUTER JOIN APONTAMENTO B ON A.CODIGO = B.COD_FUNC_R
AND SUBSTR(B.DATA,7,4) = PARAMETRO1 AND SUBSTR(B.DATA,4,2) = PARAMETRO2;
DBMS_OUTPUT.PUT_LINE('TOTAL '||TOTAL);
END;

No Visual Basic 6.0

Dim bd2 As New ADODB.Connection
Dim rs2 As ADODB.Recordset
Dim SQL2 As String

bd2.Open ("DSN=APONTAMENTO;uid=USINA;pwd=USA")


SQL2 = "call TOTAL_HORAS_APO('" & Combo3.Text & "','" & Combo1.Text & "');"
Set rs2 = bd2.Execute(SQL2)

Text9.Text = FormatNumber(rs2.Fields("TOTAL"), -1)


Mas tá dando erro:
Run_time error '3265'
Item cannot be found in the collection corresponding to the requested
name or ordinal.

Alguém pode me ajudar? Por Favor é muito importante eu conseguir solucionar
este problema.
Eu quero que o text9.text receba o valor retornado na procedure.

[[ ]]'s a todos

Renato

Renato Tavares

unread,
Sep 23, 2004, 7:19:19 PM9/23/04
to
Pessoal
Bom Dia!!!!

Alguém Sabe como executar uma procedure que está no
ORACLE através do VB6 ?

No SQL Server 2000 eu faço assim:

RecordSource = " nome_da_procedure "

Ele executa o comando normalmente, mas quando faço a mesma
coisa utilizando o ORACLE ele dá erro e não executa. Será
que tenho que adicionar alguma biblioteca? alguém já passou
por este tipo de problema e pode me ajudar?

[[ ]]'s a todos

Renato

Samuel Leandro Barbosa

unread,
Sep 28, 2004, 4:25:41 PM9/28/04
to
- Não adianta usar o dbms_output.put_line neste caso, pois o retorno que vc quer não é um Recordset, e sim um valor escalar

- Nem precisa converter em FUNCTION

Basta criar um parâmetro de saída na procedure:

CREATE OR REPLACE PROCEDURE "USINA"."TOTAL_HORAS_APO"
(PARAMETRO1 IN VARCHAR2,

PARAMETRO2 IN VARCHAR2,
PARAMETRO3 OUT NUMBER )
AS

TOTAL NUMBER;

BEGIN
SELECT SUM(B.QUANT) AS QUANT

INTO PARAMETRO3

FROM FUNCIONARIOS A LEFT OUTER JOIN APONTAMENTO B ON A.CODIGO = B.COD_FUNC_R
AND SUBSTR(B.DATA,7,4) = PARAMETRO1 AND SUBSTR(B.DATA,4,2) = PARAMETRO2;

END;


No Visual Basic 6.0, trabalhe com o objeto ADODB.Command:

Dim bd2 As New ADODB.Connection

Dim Comando as New ADODB.Command

bd2.Open ("DSN=APONTAMENTO;uid=USINA;pwd=USA")

Set Comando.ActiveConnection=bd2
With Comando
.CommandText="TOTAL_HORAS_APO"
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter("PARAMETRO1", adVarChar, 50, adParamInput, Combo3.Text)
.Parameters.Append .CreateParameter("PARAMETRO2", adVarChar, 50, adParamInput, Combo1.Text)
.Parameters.Append .CreateParameter("PARAMETRO3", adNumeric, , adParamOutput)

.Execute

End With

Text9.Text = FormatNumber(Comando.Parameters("PARAMETRO3").Value, -1)

Kiyoshi Kobayashi

unread,
Sep 29, 2004, 6:29:10 PM9/29/04
to
Renato,

Aconselho que voce converta a Procedure Oracle em Function já que necessita apenas de um parâmetro de retorno:

DROP PROCEDURE TOTAL_HORAS_APO;

CREATE OR REPLACE <B>FUNCTION</B> "USINA"."TOTAL_HORAS_APO"
(PARAMETRO1 IN VARCHAR2,
PARAMETRO2 IN VARCHAR2 ) <B>RETURN VARCHAR2
IS
</B>

TOTAL NUMBER;

BEGIN

SELECT SUM(B.QUANT) AS QUANT
INTO TOTAL

FROM FUNCIONARIOS A LEFT OUTER JOIN APONTAMENTO B ON A.CODIGO = B.COD_FUNC_R
AND SUBSTR(B.DATA,7,4) = PARAMETRO1 AND SUBSTR(B.DATA,4,2) = PARAMETRO2;

<B>RETURN 'TOTAL '||TOTAL</B>;
END;

<B>No Visual Basic 6.0</B>


Dim bd2 As New ADODB.Connection

Dim Cmd As New ADODB.Command
Dim SQL2 As String

bd2.Open ("DSN=APONTAMENTO;uid=USINA;pwd=USA")

Cmd.ActiveConnection = bd2

x_ret = space(50)

Set retorno = Cmd.CreateParameter("retorno", adBSTR, adParamOutput,50,x_ret)
Set parametro1 = Cmd.CreateParameter("parametro1", adBSTR, adParamInput, ,Combo3.Text)
Set parametro2 = Cmd.CreateParameter("parametro2", adBSTR, adParamInput, ,Combo1.Text)
Cmd.Parameters.Append retorno
Cmd.Parameters.Append parametro1
Cmd.Parameters.Append parametro2

SQL2 = "Begin ?:= TOTAL_HORAS_APO(?,?); End;"

Cmd.CommandText = SQL2

Cmd.Execute

Text9.Text = retorno.value


[]'s

Kiyoshi Kobayashi

0 new messages