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
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
- 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)
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