RESPUESTA A LA PREGUNTA 6005 - POWER BUILDER Declarar un procedimiento almacenado en Oracle y que PowerBuilder lo sepa. Esta declaración de una función/procedimiento se hace en el objeto de usuario transacción (por ejemplo n_tr para una aplicación PFC). Una vez dentro del objeto de usuario transacción, elegimos "Declare-Local External Functions" y escribimos la sintaxis de más abajo. 1.1 Procedimineto almacenado (no empaquetado) La sintaxis de la declaración para un procedimiento almacenado (sobre si mismo, en el exterior del empaquetado) es: SUBROUTINE SubRtnName(args) RPCFUNC En el ejemplo1.1, la declaración pasa un string por valor (i.e. IN) y un string por referencia (i.e. IN OUT o OUT). SUBROUTINE CalcAmount(string LS_In1, ref string LS_Out2) RPCFUNC Notas: - Si el procedimiento no está empaquetado y no toma ningún parámetro de array, entonces puedes pulsar el botón de procedimientos para pegarlo en en la declaración de procedimientos directamente desde la base de datos. - Una claúsula alias opcional puede ser aañadida para permitir al PowerBuilder un nombre de función diferente de Oracle (ver el formato alias usado con las declaraciones empaquetadas). 1.2 Procedimiento en el interior de un paquete Oracle La sintaxis de la declaración para un procedimiento almacenado en el interior de un paquete es: SUBROUTINE SubRtnName(args) RPCFUNC ALIAS FOR "PackageName.ProcName" En el ejemplo 1.2, la declaración pasa un string por valor (i.e. IN) y un string array por referencia (i.e. IN OUT or OUT). SUBROUTINE CalcPenaltyAmt(string LS_In1, ref string LS_Out2[]) RPCFUNC ALIAS FOR "Penalty.P_Calc_Amount" 1.3 Función almacenada (no empaquetada) La sintaxis de la declaración para una función almacenada (sobre si misma, en el exterior del empaquetado) es: FUNCTION ReturnType FcnName(args) RPCFUNC En el ejemplo 1.3, la declaración pasa un string por valor (i.e. IN) y un string array por referencia (i.e. IN OUT or OUT) y retorna un long. FUNCTION long CalcAmount(string LS_In1, ref string LS_Out2[]) RPCFUNC Nota: las mismas notas dadas para los procedimientos almacenados se aplican a las funciones almacenadas. 1.4 Función en el interior de un paquete Oracle La sintaxis de la declaración para una función almacenada en el interior de un paquete es: FUNCTION ReturnType FcnName(args) RPCFUNC ALIAS FOR "PackageName.FunctionName" En el ejemplo 1.4, la declaración pasa un string por valor (i.e. IN) y un string array por referencia (i.e. IN OUT or OUT) y retorna un long. FUNCTION long CalcPenaltyAmt(string LS_In1, ref string LS_Out2[])) RPCFUNC ALIAS FOR "Penalty.f_Calc_Amount" Paso 2. Invocando un procedimiento/función almacenado de Oracle Esta es la sintaxis de invocación para un procedimiento/función almacenado que ha sido declarado en el objeto transacción que se muestra más abajo. Notas sobre variables pasadas por referencia. Las variables de salida a las que se les asigna tamaño dinámicamente (por ejemplo strings y arrays) pueden ser preasignadas con el tamaño que se necesite. Cuando usamos este método de invocación, PowerBuilder no asigna dinámicamente e espacio necesario para ellas. Límite de tamaño en un array: el número de elementos de un array no puede exceder de 32K. 2.1 Invocando un procedimiento almacenado La sintaxis para invocar un procedimiento almacenado es: TransactionObjectName.ProcName(args) Ejemplo de invocación : string in_parm1 string out_parm2 in_parm1 = "valor de entrada" out_parm2 = space(50) //preasignamos el espacio del string SQLCA.CalcAmount(in_parm1, out_parm2) 2.2 Invocando una función almacenada (se muestra usando una variable array) La sintaxis para la invocación es: ReturnValue = TransactionObjectName.FcnName(args) Ejemplo de invocación : string in_parm1 string out_parm2[5] // definimos un array de tamaño fijo long ll_return in_parm1 = "valor de entrada" // preasignamos espacio para 500 caracteres para todo el string array. Cada elemento tendrá efectivamente 500 bytes por la preasignación del primero. out_parm2[1] = space(500) ll_Return = SQLCA.CalcAmount(in_parm1, out_parm2[]) Espero que te sirva Adolfo Chairez achairez@lajat.com.mx