Основной вопрос Oracle - PullRequest
       35

Основной вопрос Oracle

3 голосов
/ 02 декабря 2010

Я новичок в оракуле.Когда я создаю хранимую процедуру, используя:

CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

, я получаю следующие ошибки:

PL / SQL-оператор Игнорируемый идентификатор FIRSTNAME должен быть объявлен ORA-00904 Неверный идентификатор

Ответы [ 4 ]

7 голосов
/ 02 декабря 2010

Вам нужно объявить переменные, прежде чем пытаться их заполнить:

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;

Нотация% TYPE является сокращением для объявления типа данных, соответствующего типу данных столбца. Если этот тип данных когда-либо изменяется, вам не нужно обновлять процедуру.

3 голосов
/ 02 декабря 2010

Вам необходимо объявить переменные.

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;

В ответ на ваш комментарий операторы SQL в блоке PL / SQL могут извлечь только 1 запись. Если вам нужно получить несколько записей, вам нужно будет сохранить записи в курсоре и обработать их.

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;

Объяснить: EMP_CUR содержит инструкцию SQL для выполнения. EMP_CUR_REC содержит записи, которые будут извлечены оператором SQL. %ROWTYPE указывает, что запись будет иметь тот же тип данных, что и строка, в которой хранятся данные

FOR LOOP будет извлекать каждую запись, и вы можете выполнять любую необходимую обработку.

2 голосов
/ 02 декабря 2010


Я думаю, что ключевое слово "AS" не будет работать.Если это не сработает, используйте «IS».
Отдых - это хорошо и очень хорошие советы.

Если вам нужна помощь по PL / SQL, вы можете взглянуть по этой ссылке.Это очень просто и легко понять;
http://plsql -tutorial.com /

Это мое решение для ошибки, которую вы получаете;

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;

Вы также можете использовать DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME) внутри цикла для отображения вывода.но для этого сначала нужно выполнить команду server output on

1 голос
/ 03 декабря 2010

В ответе на ответ @ Сатья выше @kayak спросил: «Могу ли я иметь что-то вроде Select * from Tablename или выбрать имя, фамилию из tablename, как у нас на сервере sql».

Да, вы можете сделать это, но вам нужно будет либо включить предложение WHERE, либо использовать курсор. Если вы включите предложение WHERE, ограничивающее ваши результаты одной строкой, вы можете написать что-то вроде

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

С другой стороны, если у вас либо нет предложения WHERE, потому что вы хотите обработать все строки в таблице, либо у вас есть предложение WHERE, которое не ограничивает ваши результаты одной строкой, вы можете использовать курсор следующим образом:

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; 

Делись и наслаждайся.

...