我是oracle的新手。当我使用:
创建存储过程时CREATE OR REPLACE PROCEDURE PROCEDURE1
AS
BEGIN
SELECT FIRSTNAME,
LASTNAME
INTO FirstName,LastName
FROM EMPLOYEE;
END PROCEDURE1;
我收到以下错误:
忽略PL / SQL语句 必须声明标识符FIRSTNAME ORA-00904标识符无效
答案 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;
分享并享受。