domanda di base Oracle
-
30-09-2019 - |
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
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.