Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

[SOLUCIONADO] Procedimientos y Funciones

Estas en el tema de Procedimientos y Funciones en el foro de Oracle en Foros del Web. Hola... Espero y me puedan ayudar... Tengo la siguiente tabla @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE TABLE ARTICULOS ( CODARTICULO NUMBER ( 12 ) ...
  #1 (permalink)  
Antiguo 02/10/2013, 12:16
Avatar de 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
  #2 (permalink)  
Antiguo 02/10/2013, 13:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Procedimientos y Funciones

Cita:
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...
Pues es medio obvio: El problema no está en los procedimientos, sino en la codificación de la aplicación. Estás creando mal los parámetros de los datos que mandas.
Para que se entienda: Oracle es un poco estricto en cuanto a los tipos de dato.
¿En qué lenguaje trabajas para esa programación?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/10/2013, 15:32
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Procedimientos y Funciones

A vuelo de pajaro, veo que tu procedimiento MODIFICAR_ART tiene 2 parametros de entrada y uno de salida. al momento de invocarlo, solo le envias 2 parametros.

Trata de hacerlo así:
Código SQL:
Ver original
  1. DECLARE
  2. RES VARCHAR2(80);
  3. BEGIN
  4.  dbms_output.put_line(PACK_ART.MOSTRAR_ART(111));
  5.  dbms_output.put_line(PACK_ART.MODIFICAR_ART(111,'SILLA',RES));
  6.  PACK_ART.INSERTAR_ART(112,'PELOTA',TO_DATE('20100115','YYYYMMDD'));
  7.  dbms_output.put_line(RES);
  8. END;

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #4 (permalink)  
Antiguo 03/10/2013, 11:03
Avatar de LordJhony  
Fecha de Ingreso: septiembre-2010
Mensajes: 472
Antigüedad: 13 años, 8 meses
Puntos: 24
Respuesta: Procedimientos y Funciones

Gracias por sus respuestas...

Cita:
¿En qué lenguaje trabajas para esa programación?
Estoy trabajando en oracle express edition 10g

Cita:
A vuelo de pájaro, veo que tu procedimiento MODIFICAR_ART tiene 2 parámetros de entrada y uno de salida. al momento de invocarlo, solo le envías 2 parámetros.
Corregí lo que me dices en ambos procedimientos, en el procedimiento insertar funciono perfectamente, ahora en el procedimiento Modificar, al hacer la corrección me tira el siguiente error

Cita:
en este ámbito no existe ninguna función cuyo nombre sea 'MODIFICAR_ART'
  #5 (permalink)  
Antiguo 03/10/2013, 12:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Procedimientos y Funciones

Cita:
Estoy trabajando en oracle express edition 10g


Eso no es lo que pregunté. Lo que te quería saber es si la invocación la estás manejando con algún lenguaje de programación, en una aplicación (Java, PHP, VB.Net, C#, etc.), para entender por dónde y cómo establas llamando a la misma.
de todos modos, por lo que se entiene de lo que dijiste luego, esto lo estás llamado desde otro PL/SQL, por lo que ya no parece trascendente.

En cuanto al mensaje, sería buena idea que postearas el código e error. Es más fácil saber de qué hablas si provees información técnica relevante.

Bueno, en principio, deberías estar recibiendo el error PLS-00222, que la función invocada o no existe, o estás llamando como función a un objeto que es otra cosa (por ejemplo, llamas ese nombre como función, pero es un stored procedure).
Es un problema de lo que se denomina "entorno de existencia".
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 03/10/2013, 15:35
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Procedimientos y Funciones

Exacto gnzsoloyo.

Está llamando al procedure como si fuera una función.
  #7 (permalink)  
Antiguo 03/10/2013, 17:15
Avatar de LordJhony  
Fecha de Ingreso: septiembre-2010
Mensajes: 472
Antigüedad: 13 años, 8 meses
Puntos: 24
Respuesta: Procedimientos y Funciones

Muchas gracias...
El problema estaba en que, como ustedes dijeron, invocaba el procedimiento como función...
Doy por solucionado el tema...

Etiquetas: plsql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:20.