基本的Oracle问题

时间:2010-12-02 17:28:43

标签: sql oracle stored-procedures plsql ora-00904

我是oracle的新手。当我使用:

创建存储过程时
CREATE OR REPLACE PROCEDURE PROCEDURE1 
AS
BEGIN

  SELECT FIRSTNAME,
         LASTNAME
    INTO FirstName,LastName
    FROM EMPLOYEE;

END PROCEDURE1;

我收到以下错误:

  

忽略PL / SQL语句    必须声明标识符FIRSTNAME    ORA-00904标识符无效

4 个答案:

答案 0 :(得分:7)

您需要在尝试填充变量之前声明变量:

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表示法是与列数据类型匹配的数据类型声明的简写。如果该数据类型发生变化,则无需更新过程。

答案 1 :(得分:3)

您需要声明变量。

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;

在回复您的评论时,PL / SQL块中的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 :(得分:2)


我认为“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

答案 3 :(得分:1)

在回复@Sathya上面的答案时@kayak问道:“我可以从Tablename中选择Select *或者从tablename中选择firstname,lastname,就像我们在sql server中一样”。

是的,您可以这样做,但您需要包含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; 

分享并享受。