2012-03-25 18 views
7

Este es el programa que escribí:El identificador debe ser declarado? PL error/SQL

set serveroutput on; 
declare 
    b empl.name1%type; 
    r varchar; --can i change this to r empl.designation%type; ? 
begin 
    r:=&designation;      --getting input for the designation 
    dbms_output.put_line('hello');   --random output to check for errors 
    select name1 into b from empl where designation=r; --i want all the names from the table 
    dbms_output.put_line('name'||b);     --employee where designation is as entered 
    dbms_output.put_line(' closed');     --by user,should i loop this statement? 
end; 

Cuando entro designación como 'a' (que se introduce en la tabla ya) me da un error identifier 'a' is not declared. Qué significa eso? ¿La instrucción select toma una fila a la vez? Entonces, si hago un bucle obtendré todas las filas? ¿O debería usar un cursor? ¿Por qué SQL Developer no acepta %rowtype?

he cambiado de programa para esto:

set serveroutput on; 
declare 
    cursor cempl is select name1,designation from empl; 
    b empl.name1%type; 
    des empl.designation%type; 
    r empl.designation%type; 
begin 
    r:='meow'; 
    dbms_output.put_line('hello'); 
    open cempl; 
    if cempl%ISOPEN then 
    loop 
     fetch cempl into b,des; 
     if des=r then 
     dbms_output.put_line('name'||b); 
     end if; 
     exit when cempl%notfound; 
    end loop; 
    close cempl; 
    dbms_output.put_line(' closed'); 
    end if; 
end; 

En cuanto tenga una entrada como r:=&r e imaginar entro 'a' Dice identificador 'a' debe declararse, pero es un valor de la tabla ! ¿Por qué debería declararse, pero si se da en el programa como arriba no da un error? ¡En cambio, repite la última fila dos veces!

Respuesta

8

Aquí hay algunas preguntas para responder aquí:

  • Errores del 'identificador no encontrado': &designation es una variable de sustitución SQL * Plus. Cuando ingresa un valor para &designation, SQL * Plus reemplaza &designation con el texto de lo que ingresó. Por lo tanto, si se introduce la vaue a, la línea

    r:=&designation; 
    

    convierte

    r:=a; 
    

    surge el error porque Oracle no sabe nada de la llamada a. No ha declarado una variable llamada a, y no hay un procedimiento o función o cualquier otra cosa que pueda encontrar con el nombre a. Si desea que el resultado final sea r:='a';, deberá escribir r:='&designation';

  • SELECT ... INTO ... solo funciona si la consulta devuelve exactamente una fila.Si no se devuelven las filas, obtendrá un error no data found, y si se devuelve más de una fila, obtendrá un error too many rows. Solo debe usar SELECT ... INTO ... si sabe que solo habrá un resultado. Si puede haber más de un resultado, debe usar un cursor.

  • '¿Por qué SQL Developer no acepta %rowtype'? Debería ser así, ¿podría proponer un ejemplo que le cause un problema?

  • En el segundo ejemplo, la última fila se repite porque no sale del ciclo inmediatamente después de que el cursor no encuentra más filas. Debería mover la línea exit when para colocarla inmediatamente debajo de la línea fetch.

+0

gracias, sí lo noté y lo cambié;) – LoveMeow

3

mirado en primera secuencia de comandos:

set serveroutput on; 
declare 
    b empl.name1%type; 
    r empl.designation%type; -- made a change here 
begin 
    r:='&designation';      --made a change here 
    dbms_output.put_line('hello');    
    select name1 into b from empl where designation=r; 
    dbms_output.put_line('name'||b);     
    dbms_output.put_line(' closed');     
end; 
  1. si se declara como r varchar2 entonces usted necesita para establecer la longitud, ie- varchar2(32)
  2. Cuando se asigna un valor de r es necesario incluir la ', por lo que puede ponerlo en el guión (como en el código anterior o puede asignar a un valor designation containiing la ' como 'a'

He probado el código anterior de SQL * Plus y funciona


Lo que pasa es que después de poner a para &designation (sin el ') el código es el siguiente:

r:=a; 

ya que no hay un identificador a dispara la excepción

+0

Muchas gracias! Funcionó;) – LoveMeow

Cuestiones relacionadas