Domanda

Sono nuovo di oracolo. Quando creo una stored procedure utilizzando:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

ottengo i seguenti errori:

  

PL / SQL Statement Ignorato    Identifier NOME deve essere dichiarato    ORA-00904 identificativo valido

È stato utile?

Soluzione


Penso che la parola chiave "AS" non funzionerà. Se non funziona, quindi utilizzare "È".
Riposo sono belle e molto buoni consigli.

Se avete bisogno di aiuto per quanto riguarda PL / SQL, allora si può dare un'occhiata a questo link. E 'molto semplice e facile da capire;
http://plsql-tutorial.com/

Questa è la mia soluzione per l'errore che hai trovato;

CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
  v_FIRSTNAME EMPLOYEE.FIRSTNAME%TYPE;
  v_LASTNAME EMPLOYEE.LASTNAME%TYPE;
  CURSOR EMPCURSOR IS
  SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE;      
  BEGIN   
     IF NOT EMPCURSOR%ISOPEN THEN
         OPEN EMPCURSOR;
     END IF;
     LOOP
        FETCH EMPCURSOR INTO V_FIRSTNAME,V_LASTNAME;
        EXIT WHEN EMPCURSOR%NOTFOUND;
     END LOOP;
     IF EMPCURSOR%ISOPEN THEN
        CLOSE EMPCURSOR;
     END;
  END PROCEDURE1;

È inoltre possibile utilizzare DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME), all'interno del ciclo per visualizzare l'output. ma per fare questo, è necessario prima di eseguire il comando server output on

Altri suggerimenti

È necessario dichiarare le variabili prima di tentare di compilare loro:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS

 FirstName EMPLOYEE.FIRSTNAME%TYPE;
 LastName EMPLOYEE.LASTNAME%TYPE;

BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

La notazione% TYPE è una scorciatoia per dichiarazione del tipo di dati che corrisponde al tipo di dati della colonna. Se questo tipo di dati cambia mai, non è necessario per aggiornare la procedura.

È necessario dichiarare le variabili.

CREATE OR REPLACE
PROCEDURE PROCEDURE1 AS
 V_FIRSTNAME VARCHAR2(60);
 V_LASTNAME  VARCHAR2(60);
BEGIN
        SELECT FIRSTNAME,LASTNAME
         INTO V_FIRSTNAME ,V_LASTNAME  
         FROM EMPLOYEE;
END PROCEDURE1;

In risposta al tuo commento, istruzioni SQL in blocco PL / SQL può recuperare solo 1 record. Se avete bisogno di recuperare più record, è necessario memorizzare i record in un cursore ed elaborarli.

CREATE OR REPLACE
    PROCEDURE PROCEDURE1 AS

     CURSOR EMP_CUR IS
         SELECT FIRSTNAME,LASTNAME
         FROM EMPLOYEE;
    EMP_CUR_REC EMP_CUR%ROWTYPE;

    BEGIN
     FOR EMP_CUR_REC IN EMP_CUR LOOP
         -- do your processing
         DBMS_OUTPUT.PUT_LINE('Employee first name is ' || EMP_CUR_REC.FIRSTNAME);
         DBMS_OUTPUT.PUT_LINE('Employee last name is ' || EMP_CUR_REC.LASTNAME);
    END LOOP;
    END PROCEDURE1;

Per spiegare:    EMP_CUR detiene l'istruzione SQL da eseguire.    EMP_CUR_REC detiene il record che viene prelevato dalla dichiarazione di SQL.     %ROWTYPE indica che il record sarà dello stesso tipo di dati della riga che contiene i dati

Il FOR LOOP preleverà ogni record, e si può fare qualunque cosa di elaborazione che deve essere fatto.

In una risposta a @ risposta di Sathya sopra @kayak chiesto "Posso avere qualcosa di simile Select * from Nometabella o selezionare nome, cognome da tablename, come abbiamo in sql server".

Sì, è possibile farlo, ma potrete sia necessario includere una clausola WHERE o utilizzare un cursore. Se si include una clausola WHERE che limita i risultati a una singola riga si potrebbe scrivere qualcosa di simile

CREATE OR REPLACE PROCEDURE PROCEDURE1
IS
  rowEmployees EMPLOYEE%ROWTYPE;
BEGIN
  SELECT *
    INTO rowEmployees
    FROM EMPLOYEE
    WHERE EMPLOYEE_ID = 12345;
END PROCEDURE1; 

D'altra parte, se o non hanno una clausola WHERE, perché si desidera elaborare tutte le righe della tabella, o si dispone di una clausola WHERE che non limita i risultati a una singola riga è possibile utilizzare un cursore nel seguente modo:

CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
BEGIN
  FOR rowEmployees IN (SELECT *
                         FROM EMPLOYEE
                         WHERE EMPLOYEE_ID IN (12345, 67890, 111213, 141516))
  LOOP
    <do something with rowEmployees here>
  END LOOP;
END PROCEDURE1; 

Condividere e godere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top