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

PL/SQL en Oracle9i

Estas en el tema de PL/SQL en Oracle9i en el foro de Oracle en Foros del Web. Hola a todos! Tengo problemas con la siguiente transacción, al ejecutarla las variables del prompt, sólo me pide valores para algunas en vez de para ...
  #1 (permalink)  
Antiguo 31/05/2006, 10:22
 
Fecha de Ingreso: mayo-2006
Mensajes: 5
Antigüedad: 18 años
Puntos: 0
PL/SQL en Oracle9i

Hola a todos! Tengo problemas con la siguiente transacción, al ejecutarla las variables del prompt, sólo me pide valores para algunas en vez de para todas, y tambien me dice que "la variable w_street_2 no está declarada" cuando claramente está en el DECLARE arriba del todo, no sé si tendrá mas fallos porque después de dar ese mensaje se para. Aquí os dejo el código.

DECLARE
namecount NUMBER;
n NUMBER;
h_data history.h_data%TYPE;
h_date history.h_date%TYPE;
w_id warehouse.w_id%TYPE := 1;
w_street_1 warehouse.w_street_1%TYPE;
w_street_2 warehouse.w_street_2%TYPE;
w_city warehouse.w_city%TYPE;
w_zip warehouse.w_zip%TYPE;
W_name warehouse.w_name%TYPE;
d_street_1 district.d_street_1%TYPE;
d_street_2 district.d_street_2%TYPE;
d_city district.d_city%TYPE;
d_zip distric.d_zip%TYPE;
d_name district.d_name%TYPE;
d_state district.d_state%TYPE;
w_state warehouse.w_id%TYPE;
c_street_1 customer.c_street_1%TYPE;
c_street_2 customer.c_street_2%TYPE;
c_city customer.c_city%TYPE;
c_state customer.c_state%TYPE;
c_zip customer.c_zip%TYPE;
c_phone customer.c_phone%TYPE;
c_credit customer.c_credit%TYPE;
c_credit_lim customer.c_credit_lim%TYPE;
c_discount customer.c_discount%TYPE;
c_balance customer.c_balance%TYPE;
c_since customer.c_since%TYPE;
c_first customer.c_first%TYPE;
c_middle customer.c_middle%TYPE;
c_w_id customer.c_w_id%TYPE := 1;


SET VERIFY OFF;
ACCEPT did PROMPT 'Introduce the district ID:';
ACCEPT clast PROMPT 'Introduce the customer last name:';
ACCEPT cid PROMPT 'Introduce the customer ID:';
ACCEPT cdid PROMPT 'Introduce the district ID:';
ACCEPT hamount PROMPT 'Introduce the payment amount:';
ACCEPT cont PROMPT 'Introduce a value for cont:';
SET SERVEROUTPUT ON;
DECLARE
d_id district.d_id%TYPE := &did;
c_last customer.c_last%TYPE := &clast;
c_id customer.c_id%TYPE := &cid;
c_d_id customer.c_d_id%TYPE := &cdid;
h_amount history.h_amount%TYPE := &hamount;
vcont number := &cont;


BEGIN

SELECT sysdate FROM dual
INTO :h_date;

UPDATE warehouse SET w_ytd = w_ytd + :h_amount
WHERE w_id=:w_id;

SELECT w_street_1, w_street_2, w_city, w_state, w_zip, w_name
INTO :w_street_1, :w_street_2, :w_city, :w_state, :w_zip, :w_name
FROM warehouse
WHERE w_id=:w_id;

UPDATE district SET d_ytd = d_ytd + :h_amount
WHERE d_w_id=:w_id AND d_id=:d_id;

SELECT d_street_1, d_street_2, d_city, d_state, d_zip, d_name
INTO :d_street_1, :d_street_2, :d_city, :d_state, :d_zip, :d_name
FROM district
WHERE d_w_id=:w_id AND d_id=:d_id;

IF cont > 60 then
SELECT c_first, c_middle, c_last,
c_street_1, c_street_2, c_city, c_state, c_zip,
c_phone, c_credit, c_credit_lim,
c_discount, c_balance, c_since
INTO :c_first, :c_middle, :c_last,
:c_street_1, :c_street_2, :c_city, :c_state, :c_zip,
:c_phone, :c_credit, :c_credit_lim,
:c_discount, :c_balance, :c_since
FROM customer
WHERE c_w_id=:c_w_id AND c_d_id=:c_d_id AND c_id=:c_id;
ELSE /* by name */
SELECT count(c_id) INTO :namecnt
FROM customer
WHERE c_last=:c_last AND c_d_id=:c_d_id AND c_w_id=:c_w_id;

DECLARE c_byname CURSOR FOR
SELECT c_first, c_middle, c_id,
c_street_1, c_street_2, c_city, c_state, c_zip,
c_phone, c_credit, c_credit_lim,
c_discount, c_balance, c_since
FROM customer
WHERE c_w_id=:c_w_id AND c_d_id=:c_d_id AND c_last=:c_last
ORDER BY c_first;

OPEN c_byname;

IF mod(namecount,2) <> 0 then
SET namecount = :namecount + 1;
END IF;

FOR n=1 TO namecount/2 DO
BEGIN
FETCH c_byname
INTO :c_first, :c_middle, :c_id,
:c_street_1, :c_street_2, :c_city, :c_state, :c_zip,
:c_phone, :c_credit, :c_credit_lim,
:c_discount, :c_balance, :c_since;
END;

CLOSE c_byname;
END IF; /* else */


h_data := :w_name || ' ' || :d_name;

INSERT INTO history (h_c_d_id, h_c_w_id, h_c_id, h_d_id,
h_w_id, h_date, h_amount, h_data)
VALUES (:c_d_id, :c_w_id, :c_id, :d_id,
:w_id, :h_date, :h_amount, :h_data);

COMMIT;

dbms_output.put_line('Warehouse:'||to_char(w_id));
dbms_output.put_line('District:'||to_char(d_id));
dbms_output.put_line('Customer:'||to_char(c_id));


END;
/
  #2 (permalink)  
Antiguo 31/05/2006, 10:31
Avatar de Worp9975  
Fecha de Ingreso: mayo-2006
Ubicación: LV-426
Mensajes: 203
Antigüedad: 18 años
Puntos: 1
Puedo preguntarte porqué quieres recoger datos en Oracle así ? , Oracle no está diseñado para actuar como un lenguaje como C / Java por ejemplo.

Lo normal es que proceses todos los datos a través de tablas; ya sea tablas de memoria o tablas física.

Salu2
  #3 (permalink)  
Antiguo 01/06/2006, 02:14
 
Fecha de Ingreso: mayo-2006
Mensajes: 5
Antigüedad: 18 años
Puntos: 0
La verdad es que no lo sé, se supone que tengo que implementar las transacciones del tpc-c benchmark para que vayan en oracle, y esa es una de ellas, es la primera vez que uso oracle y el profesor que me "lleva" el proyecto no ha usado oracle nunca, así que no tengo mucha ayuda. ¿Cómo puedo hacerlo entonces? Gracias.
  #4 (permalink)  
Antiguo 01/06/2006, 03:06
Avatar de Worp9975  
Fecha de Ingreso: mayo-2006
Ubicación: LV-426
Mensajes: 203
Antigüedad: 18 años
Puntos: 1
No sé que es eso del tpc-c benchmark, pero para meter datos en tablas de Oracle y poder hacer consultas, etc etc etc podrías cargar los datos en oracle desde ficheros de texto con SQLLOADER o podrías hacer un programa en Oracle que te abra un fichero recoja los valores de ese fichero y vaya rellenando las tablas . Otra opción es: te haces un script sql con los inserts que necesites en tus tablas .

Te lo comento porque en ppio Oracle tiene ordenes para recoger datos pero no es de su filosofía. Si vas a presentar un programa para un trabajo o algo así no quedaría muy bien ,.. pienso yo.

Salu2
  #5 (permalink)  
Antiguo 01/06/2006, 04:52
 
Fecha de Ingreso: mayo-2006
Mensajes: 5
Antigüedad: 18 años
Puntos: 0
A ver, pero las tablas ya están creadas y ya tengo todos los datos insertados, eso lo hice con el data workbench, las tablas están llenas de miles de datos, y ahora ese código es de una transacción y tiene que hacer exactamente esas cosas porque es como están especificadas en el tpc-c este y el profesor no me deja que lo haga de otra forma. Pero el caso es que no funciona, y no entiendo lo de la variable w_street_2 que dice que no está declarada, ni lo de solo vayan unos PROMPT y los otros no. Los datos que pido por pantalla es porque en el estándar este pone que esos datos los debe introducir el usuario por teclado.
  #6 (permalink)  
Antiguo 01/06/2006, 07:13
Avatar de Worp9975  
Fecha de Ingreso: mayo-2006
Ubicación: LV-426
Mensajes: 203
Antigüedad: 18 años
Puntos: 1
Entonces para saber donde falla intenta lo siguiente:

Comenta pequeñas partes del código y lanza una ejecución para aislar el error hasta que des con donde está y así.

Salu2
  #7 (permalink)  
Antiguo 01/06/2006, 07:58
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años, 1 mes
Puntos: 3
Hola evy710:
Te recomiendo que las variables que declares sean diferentes a los nombres de los campos que existen en tus tablas.
Puedes poner que error de ORA te sale?, dependiendo de eso, se podria saber también donde esta el error.
Saludos
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #8 (permalink)  
Antiguo 01/06/2006, 12:10
 
Fecha de Ingreso: mayo-2006
Mensajes: 5
Antigüedad: 18 años
Puntos: 0
Hola PequeñoMauro, el error que me da es "SP2-0552: Variable ligada "W_STREET_2" no declarada" lo de los nombre ya lo habia pensado, le cambié el nombre a la variable, tanto en la sentencia select como en la declaración de variables, seguía mostrándome el mismo error. El error da en el primer select que ves en el bloque.
Saludos
  #9 (permalink)  
Antiguo 01/06/2006, 12:20
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años, 1 mes
Puntos: 3
antes del declare, pon:
set serveroutput on;
Y dime si te sale el mismo error...
Saludos
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #10 (permalink)  
Antiguo 01/06/2006, 13:12
 
Fecha de Ingreso: mayo-2006
Mensajes: 5
Antigüedad: 18 años
Puntos: 0
sigue dando el mismo error, además de las variables que pido por prompt, solo me pide valores para c_last, cd_id y cont.
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 17:12.