Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/10/2013, 12:16
Avatar de LordJhony
LordJhony
 
Fecha de Ingreso: septiembre-2010
Mensajes: 472
Antigüedad: 13 años, 8 meses
Puntos: 24
Procedimientos y Funciones

Hola...
Espero y me puedan ayudar...
Tengo la siguiente tabla

Código MySQL:
Ver original
  1. CREATE TABLE ARTICULOS (CODARTICULO NUMBER(12) NOT NULL PRIMARY KEY, NOMARTICULO VARCHAR2(20) NOT NULL, FECHA DATE NOT NULL);

La cual tiene almacenados unos pocos registros, en eso no hay problema.
El problema es que debo crear un paquete que tenga un procedimiento para insertar registros dentro de la tabla, un procedimiento para modificar datos y una funcion para mostrar algun dato.
Entonces, tengo el siguiente codigo

Código SQL:
Ver original
  1. CREATE OR REPLACE PACKAGE PACK_ART IS
  2.  PROCEDURE INSERTAR_ART (COD IN ARTICULOS.CODARTICULO%TYPE, NOM IN ARTICULOS.NOMARTICULO%TYPE, FEC IN ARTICULOS.FECHA%TYPE, RESULTADO OUT VARCHAR2);
  3.  FUNCTION MOSTRAR_ART (COD IN ARTICULOS.CODARTICULO%TYPE) RETURN VARCHAR2;
  4.  PROCEDURE MODIFICAR_ART (COD IN ARTICULOS.CODARTICULO%TYPE, NOM IN ARTICULOS.NOMARTICULO%TYPE, RESULTADO OUT VARCHAR2);
  5. END;
  6.  
  7.  
  8. CREATE OR REPLACE PACKAGE BODY PACK_ART IS
  9.  
  10.  PROCEDURE INSERTAR_ART (COD IN ARTICULOS.CODARTICULO%TYPE, NOM IN ARTICULOS.NOMARTICULO%TYPE, FEC IN ARTICULOS.FECHA%TYPE, RESULTADO OUT VARCHAR2) IS
  11.  BEGIN
  12.  INSERT INTO ARTICULOS VALUES (COD, NOM, FEC);
  13.  RESULTADO := 'ARTICULO INSERTADO';
  14.  EXCEPTION
  15.  WHEN OTHERS THEN RESULTADO := 'ERROR AL INSERTAR ARICULO';
  16.  END; --PRECEDURE INSERTA_SAL
  17.  
  18.  FUNCTION MOSTRAR_ART (COD IN ARTICULOS.CODARTICULO%TYPE) RETURN VARCHAR2 IS
  19.  V_COD VARCHAR2(60);
  20.  BEGIN
  21.  SELECT CODARTICULO||' '|| NOMARTICULO ||' '||FECHA INTO V_COD FROM ARTICULOS WHERE CODARTICULO = COD;
  22.  RETURN V_COD;
  23.  EXCEPTION
  24.  WHEN NO_DATA_FOUND THEN
  25.  v_cod := '** No encontrado el articulo '||to_char(COD) ;
  26.  RETURN v_cod ;
  27.  WHEN TOO_MANY_ROWS THEN
  28.  v_cod := '** Más de un registro con CODIGO '||to_char(COD)||'. Avise al Admin.' ;
  29.  RETURN v_cod ;
  30.  WHEN OTHERS THEN
  31.  v_cod := '** ERROR INESPERADO **' ;
  32.  RETURN v_cod ;
  33.  END;
  34.  
  35.  PROCEDURE MODIFICAR_ART (COD IN ARTICULOS.CODARTICULO%TYPE, NOM IN ARTICULOS.NOMARTICULO%TYPE, RESULTADO OUT VARCHAR2) IS
  36.  V_COD VARCHAR2(60);
  37.  BEGIN
  38.   UPDATE ARTICULOS
  39.   SET NOMARTICULO = NOM
  40.   WHERE ARTICULOS.CODARTICULO = COD;
  41.   RESULTADO := 'ARTICULO MODIFICADO';
  42.  EXCEPTION
  43.   WHEN OTHERS THEN RESULTADO := 'ERROR AL INSERTAR ARTICULO';
  44.  END;
  45. END;
  46.  
  47.  
  48. DECLARE
  49. RES VARCHAR2(80);
  50. BEGIN
  51.  dbms_output.put_line(PACK_ART.MOSTRAR_ART(111));
  52.  dbms_output.put_line(PACK_ART.MODIFICAR_ART(111,'SILLA'));
  53.  PACK_ART.INSERTAR_ART(112,'PELOTA',TO_DATE('20100115','YYYYMMDD'));
  54.  dbms_output.put_line(RES);
  55. END;

En el codigo anterior creo los procedimientos y la función, ademas que al final creo un subprograma que los invoque. La función, la de mostrar datos trabaja perfectamente, pero los procedimientos al momento de invocarlos me saca el error de que los argumentos en la invocación de los procedimientos no son validos...

Espero y alguien me pueda guiar para saber donde esta el error

Última edición por gnzsoloyo; 02/10/2013 a las 13:04